質問: ある関数を呼び出すとき、その関数のクラスのコンストラクタ、デストラクタがpublic以外だと、呼び出すことはできないと思いますが、クラスAのコンストラクタ、デストラクタはpublicでそのクラスAが継承しているクラスBのコンストラクタ、デストラクタがpublic以外の場合もアクセスエラーとして呼び出しができないのでしょうか?
回答: 質問文からは `class B : public A { };` なのか `class A : public B { };` なのか微妙に読み取れないんだけど ``` class A { A() { } /* private コンストラクタ */ ~A() { } /* private デストラクタ */ public: void func() const; // public なメンバ関数 }; class B : public A { public: B() { } /* public コンストラクタ */ ~B() { } /* public デストラクタ */ }; extern int xyz; int main() { A& r=*reinterpret_cast(&xyz); r.func(); } ``` であるとき - この `class A` を使って変数を作ることはできない ( `A a;` はダメ) - 同様 `B b;` もダメ (基底クラスである `A` のインスタンスが生成できないので) - (もし変数が作れたならば) `a.func();` のような呼び出しはできる - コンストラクタを経由せず無理やり変数っぽいものや参照を作ったなら `r.func();` のような呼び出しはできる(正しく構築されていないので絶対に動かないけど) ※通常、自動変数は自動的に構築破棄されるので暗黙のうちにコンストラクタ・デストラクタの呼び出しが生成されるが `private` なのでクラス外からは呼べない。 ``` class A { protected: A() { } /* protected コンストラクタ */ virtual ~A() { } /* protected デストラクタ */ public: virtual void func() const; }; class B : public A { public: B() { } /* public コンストラクタ */ ~B() { } /* public デストラクタ : 暗黙のうちに virtual である */ }; ``` であれば `A a;` なる変数定義はできないけど `B b;` なる変数定義はできるっす。同様 `b.func();` であるとか `A& ra=b;` としておいて `ra.func();` なる呼び出しは可能っす。 ※ `protected` なら派生クラス内部からは呼べる ということで sayuri さんの補足としておきたいっす。