12

here で説明されているように、派生クラスで保護されたコンストラクターを呼び出すことは許可されていません。

受け入れられた答えは、クラスのオブジェクトがクラスのサブオブジェクトである場合にのみ、基本クラスのオブジェクトのメンバーへのアクセスを許可することを説明していprotectedます。ここまでは順調ですね。AAB

しかし、なぜ (少なくとも GCC 4.6.3 では) 静的な保護されたメソッドを呼び出すことが許可されているのでしょうか? 具体的には、コメント行がコンパイルされないのに対し、次のコードがコンパイルされることは私には意味がありません。

class A 
{
protected:
    A() {}
    static A makeA() { return A(); }
};

class B: public A
{
public:
    static A makeAFromB()
    {
        return makeA(); // compiles
        // return A();  // does not compile
    }
};

哲学的には、コンストラクターは class のオブジェクトを返す静的メソッドによく似ているAため、ここで動作の違いを理解できません。

4

3 に答える 3