277

なぜこのコードは:

class A
{
    public: 
        explicit A(int x) {}
};

class B: public A
{
};

int main(void)
{
    B *b = new B(5);
    delete b;
}

次のエラーが発生します。

main.cpp: 関数 'int main()' 内:
main.cpp:13: エラー: 'B::B(int)' の呼び出しに一致する関数がありません
main.cpp:8: 注: 候補は: B::B()
main.cpp:8: 注: B::B(const B&)

B は A のコンストラクターを継承すべきではありませんか?

(これはgccを使用しています)

4

8 に答える 8

518

コンパイラが C++11 標準をサポートしている場合は、コンストラクターの継承using(しゃれた意図) があります。詳細については、ウィキペディアの C++11 の記事を参照してください。あなたが書く:

class A
{
    public: 
        explicit A(int x) {}
};

class B: public A
{
     using A::A;
};

これは全か無かです - 一部のコンストラクターだけを継承することはできません。これを記述すれば、それらすべてを継承することになります。選択したものだけを継承するには、個々のコンストラクターを手動で記述し、必要に応じてそれらから基本コンストラクターを呼び出す必要があります。

歴史的に、コンストラクターは C++03 標準では継承できませんでした。自分で基本実装を呼び出して、1 つずつ手動で継承する必要がありました。

于 2009-01-12T08:19:57.813 に答える
108

コンストラクターは継承されません。これらは、子コンストラクターによって暗黙的または明示的に呼び出されます。

コンパイラは、既定のコンストラクター (引数のないもの) と既定のコピー コンストラクター (同じ型への参照である引数を持つもの) を作成します。ただし、int を受け入れるコンストラクターが必要な場合は、明示的に定義する必要があります。

class A
{
public: 
    explicit A(int x) {}
};

class B: public A
{
public:
    explicit B(int x) : A(x) { }
};

UPDATE : C++11 では、コンストラクターを継承できます。詳細については、Suma の回答を参照してください。

于 2008-12-07T07:48:09.277 に答える
13

B でコンストラクターを明示的に定義し、親のコンストラクターを明示的に呼び出す必要があります。

B(int x) : A(x) { }

また

B() : A(5) { }
于 2008-12-07T07:47:58.637 に答える
12

これは、Bjarne Stroustrup のページからそのまま引用したものです。

そのように選択した場合でも、初期化が必要な新しいメンバー変数を定義する派生クラスでコンストラクターを継承することで、自分自身を撃つことができます。

struct B1 {
    B1(int) { }
};

struct D1 : B1 {
    using B1::B1; // implicitly declares D1(int)
    int x;
};

void test()
{
    D1 d(6);    // Oops: d.x is not initialized
    D1 e;       // error: D1 has no default constructor
}

別の優れた C++11 機能 (メンバーの初期化) を使用することに注意してください。

 int x = 77;

それ以外の

int x;

問題を解決します

于 2014-05-09T14:58:30.940 に答える
8

テンプレート関数を使用してすべてのコンストラクターをバインドするのはどうですか?

template <class... T> Derived(T... t) : Base(t...) {}
于 2014-11-07T18:40:47.790 に答える
1

正しいコードは

class A
{
    public: 
      explicit A(int x) {}
};

class B: public A
{
      public:

     B(int a):A(a){
          }
};

main()
{
    B *b = new B(5);
     delete b;
}

エラーは b/c クラス B にパラメーター コンストラクターがなく、2 番目に、基本クラスのパラメーター コンストラクターのコンストラクターを呼び出す基本クラス初期化子が必要です。

于 2014-02-20T07:48:08.123 に答える