1. ホーム
  2. c++

[解決済み】コンストラクタの継承

2022-04-01 18:30:58

質問

なぜこのようなコードになるのでしょうか。

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: error: no matching function for call to 'B::B(int)'
main.cpp:8: note: 候補は以下の通りです。B::B()
main.cpp:8: 注意: B::B(const B&)

B は A のコンストラクタを継承してはいけないのでしょうか?

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

解決方法は?

C++11標準に対応したコンパイラを使用している場合、コンストラクタの継承に using (ダジャレ)。詳しくは ウィキペディアC++11の記事 . と書いていますね。

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

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

これはall or nothingで、一部のコンストラクタだけを継承することはできず、これを書けばすべてのコンストラクタを継承することになります。選択したものだけを継承するには、個々のコンストラクタを手作業で記述し、そこから必要に応じてベースコンストラクタを呼び出す必要があります。

C++03規格では、歴史的にコンストラクタを継承することができませんでした。自分でベース実装を呼び出して、ひとつひとつ手作業で継承する必要があったのです。