C++ 継承

オブジェクト指向プログラミングにおいて最も重要な概念の一つは継承です。継承により、別のクラスに基づいてクラスを定義することができ、アプリケーションの作成と保守が容易になります。これにより、コード機能の再利用と実行効率の向上も達成できます。

クラスを作成するとき、新しいデータメンバーとメンバー関数を書き直す必要はなく、新しく作成したクラスが既存のクラスのメンバーを継承するように指定するだけです。この既存のクラスを基底クラス、新しく作成したクラスを派生クラス。

継承はis a関係を表します。例えば、哺乳類は動物であり、犬は哺乳類です。したがって、犬は動物です、など。

コードは次のとおりです。

// 基底クラス
class Animal {
    // eat() 関数
    // sleep() 関数
};


//派生クラス
class Dog : public Animal {
    // bark() 関数
};

基底クラス & 派生クラス

クラスは複数のクラスから派生できます。つまり、複数の基底クラスからデータと関数を継承できます。派生クラスを定義するには、クラス派生リストを使用して基底クラスを指定します。クラス派生リストは1つ以上の基底クラスを名前で指定し、形式は次のとおりです。

class derived-class: access-specifier base-class

ここで、アクセス修飾子 access-specifier はpublic、protected 或 privateそのうちの1つであり、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

アクセス制御と継承

派生クラスは基底クラスのすべての非プライベートメンバーにアクセスできます。したがって、基底クラスのメンバーを派生クラスのメンバー関数からアクセスされたくない場合は、基底クラスで private として宣言する必要があります。

アクセス権限に基づいて、さまざまなアクセスタイプを次のようにまとめることができます。

アクセスpublicprotectedprivate
同じクラスyesyesyes
派生クラスyesyesno
外部のクラスyesnono

派生クラスはすべての基底クラスのメソッドを継承しますが、次の場合は例外です。

  • 基底クラスのコンストラクタ、デストラクタ、コピーコンストラクタ。
  • 基底クラスのオーバーロードされた演算子。
  • 基底クラスのフレンド関数。

継承の種類

クラスが基底クラスから派生するとき、その基底クラスはpublic、protected 或 privateいくつかのタイプに継承できます。継承タイプは、上で説明したアクセス修飾子 access-specifier によって指定されます。

私たちはほとんど使用しませんprotected 或 private継承は、通常はpublic継承を使用します。異なるタイプの継承を使用する場合、次のルールに従います。

  • 公有継承(public):クラスが公有基底クラスから派生するとき、基底クラスの公有メンバーは派生クラスの公有メンバーでもあり、基底クラスの保護メンバーは派生クラスの保護メンバーでもあり、基底クラスのプライベートメンバーは派生クラスから直接アクセスできませんが、基底クラスの公有と保護メンバーを呼び出してアクセスできます。
  • 保護継承(protected):クラスが保護基底クラスから派生するとき、基底クラスの公有と保護メンバーは派生クラスの保護メンバーになります。
  • プライベート継承(private):クラスがプライベート基底クラスから派生するとき、基底クラスの公有と保護メンバーは派生クラスのプライベートメンバーになります。

多重継承

多重継承とは、1つのサブクラスが複数の親クラスを持つことができ、複数の親クラスの特性を継承することです。

C++ クラスは複数のクラスからメンバーを継承できます。構文は次のとおりです。

class <派生类名>:<继承方式1><基类名1>,<继承方式2><基类名2>,…
{
<派生类类体>
};

ここで、アクセス修飾子の継承方法はpublic、protected 或 privateそのうちの1つで、各基底クラスを修飾するために使用し、各基底クラスは上記のようにカンマで区切ります。それでは、以下の例を見てみましょう。

例

#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: $2450
その他の拡張