here で説明されているように、派生クラスで保護されたコンストラクターを呼び出すことは許可されていません。
受け入れられた答えは、クラスのオブジェクトがクラスのサブオブジェクトである場合にのみ、基本クラスのオブジェクトのメンバーへのアクセスを許可することを説明していprotected
ます。ここまでは順調ですね。A
A
B
しかし、なぜ (少なくとも 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
ため、ここで動作の違いを理解できません。