Cplusplus-cpp-inheritance
C ++の継承
オブジェクト指向プログラミングで最も重要な概念の1つは、継承の概念です。 継承を使用すると、クラスを別のクラスの観点から定義でき、アプリケーションの作成と保守が簡単になります。 これにより、コード機能を再利用して実装時間を短縮することもできます。
クラスを作成するとき、プログラマは完全に新しいデータメンバーとメンバー関数を記述する代わりに、新しいクラスが既存のクラスのメンバーを継承するように指定できます。 この既存のクラスは base クラスと呼ばれ、新しいクラスは derived クラスと呼ばれます。
継承の概念は、 is a 関係を実装します。 たとえば、哺乳類IS-A動物、犬IS-A哺乳類、したがって犬IS-A動物などです。
基本クラスと派生クラス
クラスは複数のクラスから派生できます。つまり、複数の基本クラスからデータと関数を継承できます。 派生クラスを定義するには、クラス派生リストを使用して基本クラスを指定します。 クラス派生リストは、1つまたは複数のベースクラスに名前を付け、形式があります-
class derived-class: access-specifier base-class
ここで、access-specifierは* public、protected、または *private のいずれかであり、base-classは以前に定義されたクラスの名前です。 access-specifierが使用されていない場合、デフォルトではprivateです。
次のように基本クラス*形状*とその派生クラス*長方形*を考えてください-
#include <iostream>
using namespace std;
//Base class
class Shape {
public:
void setWidth(int w) {
width = w;
}
void setHeight(int h) {
height = h;
}
protected:
int width;
int height;
};
//Derived class
class Rectangle: public Shape {
public:
int getArea() {
return (width * height);
}
};
int main(void) {
Rectangle Rect;
Rect.setWidth(5);
Rect.setHeight(7);
//Print the area of the object.
cout << "Total area: " << Rect.getArea() << endl;
return 0;
}
上記のコードをコンパイルして実行すると、次の結果が生成されます-
Total area: 35
アクセス制御と継承
派生クラスは、その基本クラスのすべての非プライベートメンバーにアクセスできます。 したがって、派生クラスのメンバー関数にアクセスできないはずの基本クラスメンバーは、基本クラスでprivateとして宣言する必要があります。
に応じてさまざまなアクセスタイプを要約できます-誰が次の方法でアクセスできるか-
Access | public | protected | private |
---|---|---|---|
Same class | yes | yes | yes |
Derived classes | yes | yes | no |
Outside classes | yes | no | no |
派生クラスは、次の例外を除いてすべての基本クラスのメソッドを継承します-
- 基本クラスのコンストラクタ、デストラクタ、およびコピーコンストラクタ。
- 基本クラスのオーバーロードされた演算子。
- 基本クラスのフレンド関数。
継承のタイプ
基本クラスからクラスを派生させる場合、基本クラスは public、protected 、または private 継承を介して継承される場合があります。 継承のタイプは、上記で説明したようにaccess-specifierによって指定されます。
*protected* または *private* 継承はほとんど使用しませんが、 *public* 継承が一般的に使用されます。 異なるタイプの継承を使用している間、次のルールが適用されます-
- パブリック継承-パブリック*基本クラスからクラスを派生させると、ベースクラスの*パブリック*メンバーは派生クラスの*パブリック*メンバーになり、ベースクラスの*保護*メンバーは*保護*メンバーになります派生クラス。 基本クラスの *private メンバーは、派生クラスから直接アクセスすることはできませんが、基本クラスの public および protected メンバーの呼び出しを介してアクセスできます。
- Protected Inheritance - protected 基本クラスから派生した場合、基本クラスの public および protected メンバーは、派生クラスの protected メンバーになります。
- Private Inheritance - private 基本クラスから派生する場合、基本クラスの public および protected メンバーは派生クラスの private メンバーになります。
多重継承
C ++クラスは、複数のクラスからメンバーを継承できます。ここに拡張構文があります-
class derived-class: access baseA, access baseB....
アクセスは* public、protected、、または *private のいずれかであり、すべての基本クラスに与えられ、上記のようにコンマで区切られます。 私たちは次の例を試してみましょう-
#include <iostream>
using namespace std;
//Base class Shape
class Shape {
public:
void setWidth(int w) {
width = w;
}
void setHeight(int h) {
height = h;
}
protected:
int width;
int height;
};
//Base class PaintCost
class PaintCost {
public:
int getCost(int area) {
return area *70;
}
};
//Derived class
class Rectangle: public Shape, public PaintCost {
public:
int getArea() {
return (width* height);
}
};
int main(void) {
Rectangle Rect;
int area;
Rect.setWidth(5);
Rect.setHeight(7);
area = Rect.getArea();
//Print the area of the object.
cout << "Total area: " << Rect.getArea() << endl;
//Print the total cost of painting
cout << "Total paint cost: $" << Rect.getCost(area) << endl;
return 0;
}
上記のコードをコンパイルして実行すると、次の結果が生成されます-
Total area: 35
Total paint cost: $2450