基本クラスに保護されたコンストラクターがある場合、クラスを直接インスタンス化することはできません。ただし、これを実行して、基本クラスのコンストラクターからコンストラクターを呼び出すことができます。
class A {
protected:
A() {}
};
class B: public A {
public:
B() : A() // allowed to access constructor like this
{
A* f = new A(); // Not allowed to access constructor like this!
}
};
以下に示すようにコンストラクターを直接呼び出すと、gcc バージョン 4.1.2 で次のエラーが発生します。
A* f = new A(); // Not allowed to access constructor like this!
test.cpp:4: error: A::A() is protected
ただし、このコンストラクターへの呼び出しではエラーは発生しません。
B() : A() // allowed to access constructor like this
この背後にある理由は、2 番目の呼び出しが許可されている継承を介して A() コンストラクターにアクセスするためです。ただし、これは、コンストラクターを直接呼び出して、明示的に A() の新しいインスタンスを作成しようとします。
A* f = new A(); // Not allowed to access constructor like this!
B は A から継承されているため、B は A のコンストラクターにアクセスできるはずなので、これは直感的ではないように思えるかもしれません。ただし、 C++ で保護されたコンストラクターを宣言すると、継承またはフレンド関係を使用しない限り、そのクラスのインスタンスを作成できません。