42

次のレイアウトを想定しています。

class Base
{
protected:
    Base(P1 p1, P2 p2, P3 p3);

public:
    virtual void SomeMethod() = 0;
}

class Derived : public Base
{
public:
    using Base::Base;

public:
    virtual void SomeMethod() override;
};

Derivedここで のコンストラクターを public として指定できるようにする必要がありますか? VC++ で次のエラーが発生します。

クラス 'Derived' で宣言されたプロテクト メンバにアクセスできません
コンパイラはここで 'Derived::Derived' を生成しました [using Base::Base 行を指しています]
'Derived' の宣言を参照してください

つまり、継承されたコンストラクターの上のアクセス修飾子を無視しています。

これは機能の制限ですか? Base直接インスタンス化できないため (純粋仮想メソッドのため) 、クラスが public コンストラクターを持っていても意味がありません。

4

1 に答える 1

34

12.9/4「コンストラクターの継承」によるとusing X::X

そのように宣言されたコンストラクターは、X の対応するコンストラクターと同じアクセス権を持ちます。

したがって、継承されたコンストラクターもprotected.

于 2014-01-09T09:23:10.293 に答える