2017-03-14 6 views
4

https://en.wikipedia.org/wiki/C++11#Object_construction_improvement警告は、C++ 11は、クラスは、その基底 クラスのコンストラクタを継承する指定することができ、ベースクラスのコンストラクタのコンストラクタ

を継承しました。したがって、C++ 11コンパイラは、 コードを生成して、継承を実行し、 派生クラスを基本クラスに転送します。これは、全部または無しの機能です: その基本クラスのコンストラクタのすべてが転送されるか、 のどれも転送されません。また、 クラスのコンストラクタを同じシグネチャの コンストラクタを使用する2つのクラスから継承できないように、複数の継承には制限があります。 継承された基底の クラスのシグネチャと一致する派生クラスのコンストラクタも存在できません。

は、誰かが私に「も派生クラスのコンストラクタはそれを継承し、基本クラスでシグネチャと一致存在することができます。」の問題を説明するための例を与えることができますか?

+0

ウィキペディアの記事を修正しました。 – Oktalist

答えて

6

それはつまり、あなたはパラメータリストのパラメータリストと一致する基底クラスのどのコンストラクタは、その派生クラスのコンストラクタが取られ、皮革基底クラスの

派生クラスでコンストラクタを持っている場合

struct Foo 
{ 
    Foo(){std::cout << "Foo default ctor\n";} 
    Foo(int){std::cout << "Foo(int)\n";} 
}; 

struct Bar : Foo 
{ 
    using Foo::Foo; 
    Bar(int){std::cout << "Bar\n";} // won't implicitly call Foo(int) 
}; 

int main() 
{ 
    Bar b(1); 
} 

から§12.9/ 3 [class.inhctor](強調鉱山):コンストラクタ はパラメータまたは有さない以外継承コンストラクタの候補セット内の各非テンプレートコンストラクタの

単一のパラメータを持つコピー/移動コンストラクタの場合、コンストラクタは暗黙のうちに同じコンストラクタの特性で宣言されています。使用宣言が現れる完全なクラスに同じ シグネチャを持つユーザ宣言コンストラクタがないか、デフォルトの そのクラスのコンストラクタをコピーまたは移動

+0

OPがコンパイルされず、いくつかの変更が加えられました。このコードは、Fooのコンストラクタを継承できることを示しています。 http://coliru.stacked-crooked.com/a/63e36a2c70f2d602 – q0987

+0

@ q0987:申し訳ありません。私はそれを正しくするために標準を詳しく見ていく必要があった。 – AndyG

関連する問題