考慮してください:
class A
{
protected:
A(int) {}
void f(int) {}
public:
A() {}
};
class B : public A
{
public:
using A::A;
using A::f;
};
int main()
{
B().f(1); // ok
B(1); // error: 'A::A(int)' is protected within this context
}
継承されたprotected
メンバー関数はできますが、継承されたpublic
コンストラクターをprotected
にできないのはなぜですか?
実際には、継承したコンストラクターを公開することはできますが、作成方法だけではありません。 B
クラスは次のように定義できます。
class B : public A {
public:
B() {}
B(int x) : A(x) {} // instead of using A::A(int)
using A::f;
};
( GodBolt で参照してください)
おそらく標準委員会はusing A::A
は少しあいまいです。これは、基本クラスのコンストラクターがサブクラスのコンストラクターとまったく同じではないためです。