Cplusplus-cpp-inheritance

提供:Dev Guides
移動先:案内検索

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