web-dev-qa-db-ja.com

コンストラクターの継承とは何ですか?

C++ 11では、コンストラクターを継承することは何を意味しますか?それが私が思うものである場合(基本クラスのコンストラクタは派生クラスのスコープに持ち込まれます)、私のコードにどのような影響がありますか?そのような機能の用途は何ですか?

65
badmaash

コンストラクターの継承は、まさにそれを意味します。派生クラスは、その基本クラスからコンストラクターを暗黙的に継承できます。

構文は次のとおりです。

struct B
{
    B(int); // normal constructor 1
    B(string); // normal constructor 2
};

struct D : B
{
    using B::B; // inherit constructors from B
};

したがって、Dには次のコンストラクタが暗黙的に定義されています。

D::D(int); // inherited
D::D(string); // inherited

Dsメンバーは、これらの継承されたコンストラクターによってデフォルトで構築されます。

コンストラクタが次のように定義されているようです。

D::D(int x) : B(x) {}
D::D(string s) : B(s) {}

この機能は特別なものではありません。これは、定型コードの入力を節約するための単なる省略表現です。

以下に詳細を示します。

12.9コンストラクターの継承

1)コンストラクタに名前を付けるusing-declarationは、継承するコンストラクタのセットを暗黙的に宣言します。 using-declarationで名前が付けられたクラスXから継承されたコンストラクターの候補セットは、次のようにデフォルトのパラメーターの変換から生じる実際のコンストラクターと概念的なコンストラクターで構成されます。

  • xのすべての非テンプレートコンストラクター、および
  • デフォルト引数を持つ少なくとも1つのパラメーターを持つXの各非テンプレートコンストラクター、Ellipsisパラメーター指定を省略し、parameter-type-listの最後からデフォルト引数を持つパラメーターを連続して省略した結果として得られるコンストラクターのセット、そして
  • xのすべてのコンストラクタテンプレート、および
  • デフォルト引数を持つ少なくとも1つのパラメーターを持つXの各コンストラクターテンプレートについて、Ellipsisパラメーター指定を省略し、parameter-type-listの最後からデフォルト引数を持つパラメーターを連続して省略した結果のコンストラクターテンプレートのセット
84
Andrew Tomazos