C++の継承
オブジェクト指向プログラミングで最も重要な概念の 1 つは継承です。継承を使用すると、別のクラスに基づいてクラスを定義できるため、アプリケーションの作成と保守が容易になります。これにより、コード関数の再利用と実行時間の向上という効果も得られます。
クラスを作成するときに、新しいデータ メンバーやメンバー関数を書き直す必要はありません。新しいクラスが既存のクラスのメンバーを継承することを指定するだけで済みます。この既存のクラスは基本クラスと呼ばれ、新しいクラスは派生クラスと呼ばれます。
継承は が 関係であることを表します。たとえば、哺乳類は動物であり、犬も哺乳類であり、したがって犬も動物である、というようになります。
基本クラスと派生クラス
クラスは複数のクラスから派生できます。つまり、複数の基本クラスからデータと関数を継承できます。派生クラスを定義するには、クラス派生リストを使用して基本クラスを指定します。クラス派生リストは 1 つ以上の基本クラスにちなんで名付けられ、次の形式になります:
class derived-class: access-specifier base-class
ここで、アクセス修飾子 access-specifier は public、protected、または private のいずれかであり、base-class は以前に定義されたクラスの名前。 access-specifier が使用されない場合、デフォルトは private です。
基底クラス Shape があり、以下に示すように Rectangle がその派生クラスであるとします。
#include <iostream> using namespace std; // 基类 class Shape { public: void setWidth(int w) { width = w; } void setHeight(int h) { height = h; } protected: int width; int height; }; // 派生类 class Rectangle: public Shape { public: int getArea() { return (width * height); } }; int main(void) { Rectangle Rect; Rect.setWidth(5); Rect.setHeight(7); // 输出对象的面积 cout << "Total area: " << Rect.getArea() << endl; return 0; }
上記のコードがコンパイルされて実行されると、次の結果が生成されます:
Total area: 35
アクセス制御と継承
派生クラスは、基本クラス内のすべての非プライベート メンバーにアクセスできます。したがって、基底クラスのメンバーが派生クラスのメンバー関数からアクセスされることを望まない場合は、基底クラスでプライベートと宣言する必要があります。
アクセス権限に基づいて、さまざまなアクセス タイプを次のように要約できます。
派生クラスはいはいいいえ外部クラスはいいいえいいえ派生クラスは、次の場合を除き、すべての基本クラスのメソッドを継承します:
基本クラスのコンストラクター、デストラクター、およびコピー コンストラクター。
基本クラスのオーバーロードされた演算子。
基本クラスのフレンド関数。
継承型
クラスが基本クラスから派生する場合、基本クラスはpublic、protected、または privateとして継承できます。継承型は、上で説明したアクセス指定子によって指定されます。
protected や private 継承を使用することはほとんどなく、通常は public 継承を使用します。さまざまなタイプの継承を使用する場合は、次の規則に従ってください:
パブリック継承 (パブリック): クラスが public基本クラスから派生する場合、基本クラスの publicメンバーも の派生クラスパブリックメンバー、基本クラスの保護されたメンバーは、派生クラスの保護されたメンバーでもあり、基本クラスのプライベートメンバーは、派生クラスから直接アクセスすることはできませんが、呼び出しによってアクセスできます基本クラスの public メンバーと protected
メンバーがアクセスします。保護された継承: クラスが protected 基本クラスから派生する場合、基本クラスの public メンバーと protected メンバーは、派生クラスの protected
メンバーになります。プライベート継承 (プライベート): クラスが private基本クラスから派生する場合、基本クラスの public メンバーと protected メンバーは、派生クラスの private
メンバーになります。
class <派生类名>:<继承方式1><基类名1>,<继承方式2><基类名2>,… { <派生类类体> };このうち、アクセス修飾子の継承メソッドは public、protected、または private のいずれかであり、各基本クラスを変更するために使用されます。上に示すように、カンマで区切ってください。次に、次の例を見てみましょう:
#include <iostream> using namespace std; // 基类 Shape class Shape { public: void setWidth(int w) { width = w; } void setHeight(int h) { height = h; } protected: int width; int height; }; // 基类 PaintCost class PaintCost { public: int getCost(int area) { return area * 70; } }; // 派生类 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(); // 输出对象的面积 cout << "Total area: " << Rect.getArea() << endl; // 输出总花费 cout << "Total paint cost: $" << Rect.getCost(area) << endl; return 0; }上記のコードがコンパイルされて実行されると、次の結果が生成されます:
Total area: 35 Total paint cost: 50🎜