HOWTO · C++

C++ 継承コンストラクタ

C++ での継承と、コンストラクターを継承する方法に関する完全なプログラミングチュートリアル。

このページの内容

この記事では、C++ での継承の概念と、派生クラスで基本クラスのコンストラクターを継承する方法について説明します。

C++ での継承

C++、特にオブジェクト指向のプログラミングでは、最も基本的で広く使用されている概念は継承の概念です。これは、あるクラスを別のクラスの子クラスとして定義できる機能です。

これにより、一部のコード機能を再利用して、実装時間を短縮することもできます。これにより、機能とプロパティを基本クラスから派生クラスに派生させることができます。

  1. 基本クラス-プロパティと機能が別のクラスによって使用されるクラスは、基本クラスと呼ばれます。スーパークラスと呼ばれることもあります。
  2. 派生クラス-別のクラスのプロパティと機能を取り込むクラスは、派生クラスと呼ばれます。サブクラスと呼ばれることもあります。

いくつかの車両の例を考えてみましょう。車、バス、トラックはすべて自動車であり、これらの自動車にはすべて共通の特徴があり、いくつかは異なります。

これらはすべて自動車であり、すべての自動車はすべての間で均一ないくつかの機能を備えています。これらすべての自動車のクラスを作成すると、多くのコードの複製が行われます。

これを下の図に示します。

継承

上の画像から、すべての自動車が同じ機能を持っていることがわかります。これにより、コードが 3 回重複します。

コードの重複は、エラーの可能性、処理時間の増加など、他の多くの問題を引き起こします。継承は、このような状況を克服するために使用されます。

これらすべての機能で構成される Automobile クラスを作成し、このクラスで残りのクラスを派生させることができます。これにより、コードの重複を減らし、コードの再利用性を高めることができます。

継承ソリューション

上の画像から、重複するコードが削減され、すべての機能がすべてのクラスに含まれていることがわかります。継承は通常、is-a 関係を定義します。

たとえば、車 is-a 自動車、円 is-a 形状、犬 is-a 動物などです。

C++ での継承の実装

基本クラスからサブクラスを派生させるには、次の構文に従う必要があります。

class derived - class - name : access - specifier base - class - name { .. }

このアクセス指定子は、基本クラスから機能を継承する方法を決定するためにあります。それらすべてが必要か、一部が必要かは、アクセス指定子に基づいて決定されます。

publicprivate、または protected にすることができます。アクセス指定子を指定しない場合、デフォルトでは private になります。

例:

public
class Automobile {
 public:
  getFuelAmount();
  applyBrakes();
  startEngine();
  stopEngine();
} public class Car : public Automobile {
  pressHorn();
} public class Bus : public Automobile {
  pressHorn();
}

上記のコードから、ホーンの音はすべての車両で異なるため、2つの派生クラスには両方で均一ではない 1つの関数しかないことがわかります。したがって、その関数を派生クラスで作成し、残りは基本クラスにあります。

Shapes クラスの別の例を考えてみましょう。

#include <iostream>
#include <string>
using namespace std;
class Shapes {
 public:
  int w;
  int h;
};
class Square : public Shapes {
 public:
  int getArea() { return w * h; }
};
int main() {
  Square s;
  s.w = 5;
  s.h = 5;
  cout << "Area: " << s.getArea() << endl;
  return 0;
}

出力:

Area: 25

C++ でのコンストラクターの継承

前の例から、関数とプロパティが基本クラスからそのまま派生クラスに継承されていることがわかります。ただし、基本クラスコンストラクターを呼び出す必要がある場合は、派生クラスのコンストラクターで明示的に呼び出す必要があります。

コンストラクターは自動的に呼び出されません。以下の例を考えてみましょう。

#include <iostream>
using namespace std;
class baseClass {
 public:
  baseClass() { cout << "In constructor: Base" << endl; }
};
class derivedClass : public baseClass {
 public:
  derivedClass() : baseClass() { cout << "In Constructor: derived" << endl; }
};
int main() {
  derivedClass d;
  cout << "In main" << endl;
}

出力:

In constructor: Base
In Constructor: derived
In main

C++ 11 では、これは using-declaration を使用して実行できます。using-declaration を使用すると、基本クラスで派生クラス関数を使用できます。

上記の例は、次のように変更できます。

#include <iostream>
using namespace std;
class baseClass {
 public:
  baseClass() { cout << "In constructor: Base" << endl; }
};
class derivedClass : public baseClass {
  using baseClass::baseClass;

 public:
  derivedClass() { cout << "In Constructor: derived" << endl; }
};
int main() {
  derivedClass d;
  cout << "In main" << endl;
}

また、同じ出力が得られます。

In constructor: Base
In Constructor: derived
In main