web-dev-qa-db-ja.com

継承された保護コンストラクターを公開できないのはなぜですか?

考慮してください:

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にできないのはなぜですか?

16
xmllmx

実際には、継承したコンストラクターを公開することはできますが、作成方法だけではありません。 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は少しあいまいです。これは、基本クラスのコンストラクターがサブクラスのコンストラクターとまったく同じではないためです。

3
einpoklum