C++では基底クラスのコンストラクタを外部から呼び出すことが出来ません。
struct A {
int a;
A(int a) : a(a) {}
};
struct B : A {};
int main() {}
B b(99); // error: No matching constructor for initialization of 'B'
}
この場合using
を用いれば、外部からスーパークラスのコンストラクタを呼び出すことが可能になります。
struct B : A {
using A::A; // 親クラスのコンストラクタを公開
};
int main() {}
B b(99); // OK!!
}
継承コンストラクタ
これらは継承コンストラクタ(Inheriting Constructors)と呼ばれるC++11の機能によって実現されます。継承コンストラクタはシンタックスシュガーであり、実際には基底クラスと同一のコンストラクタが派生クラス側で暗黙的に宣言されます。
一部のコンストラクタのみを公開
継承コンストラクタは全コンストラクタを公開するため、部分公開は出来ません。従来のように手動でコンストラクタ呼び出しを行う必要があります。
struct B {
B(int b) : A(b) {}
};
または非公開にしたいコンストラクタを手動で① private宣言、または② delete宣言する方法もあります。
struct B {
private: B(int b) : A(b) {} // ①
// B b(9); // Calling a private constructor of class 'B'
B(int b) = delete; // ②
// B b(9); // Call to deleted constructor of 'B'
};