このコードがなぜ:
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 を使用しています)
ベストアンサー1
コンパイラがC++11標準をサポートしている場合は、コンストラクタの継承が使用できますusing
(しゃれです)。詳細については、Wikipedia C++11 の記事。 あなたが書く:
class A
{
public:
explicit A(int x) {}
};
class B: public A
{
using A::A;
};
これはすべてかゼロかです。一部のコンストラクタだけを継承することはできません。これを記述すると、すべてのコンストラクタが継承されます。選択したコンストラクタだけを継承するには、個々のコンストラクタを手動で記述し、必要に応じてそこから基本コンストラクタを呼び出す必要があります。
歴史的に、C++03 標準ではコンストラクタを継承できませんでした。自分で基本実装を呼び出して、コンストラクタを 1 つずつ手動で継承する必要がありました。
テンプレート化された基本クラスについては、次の例を参照してください。
using std::vector;
template<class T>
class my_vector : public vector<T> {
public:
using vector<T>::vector; ///Takes all vector's constructors
/* */
};