50370


ある関数を呼び出すとき、その関数のクラスのコンストラクタ、デストラクタがpublic以外だと、呼び出すことはできないと思いますが、クラスAのコンストラクタ、デストラクタはpublicでそのクラスAが継承しているクラスBのコンストラクタ、デストラクタがpublic以外の場合もアクセスエラーとして呼び出しができないのでしょうか？


CC BY-SA 4.0
2018-11-15T08:36:22.857
50356
2018-11-16T06:02:31.757
2018-11-15T11:07:02.987
4236
30303
question
c++
継承しているクラスのコンストラクタ・デストラクタがpublic以外の場合の関数呼び出し


> その関数のクラスのコンストラクタ、デストラクタがpublic以外だと、呼び出すことはできないと思いますが

そんなことはありません。その関数が呼び出せるかどうかは、その関数自身のアクセス制御だけで決定されます。

ただし、コンストラクタにアクセスできない場合はインスタンスを生成できませんし、デストラクタにアクセスできない場合はインスタンスの破棄ができない（ため、破棄が発生するような変数を定義することもできません）。

これらは全く別の問題であり、依存関係はありません。例えば参照引数などでインスタンスを受け取れば、コンストラクタ・デストラクタを呼び出す必要なく、関数は呼び出せるわけです。


CC BY-SA 4.0
2018-11-15T11:06:54.997
50358
2018-11-15T11:06:54.997
4236
50356
answer


質問文からは `class B : public A { };` なのか `class A : public B { };`
なのか微妙に読み取れないんだけど

[code]

    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<A*>(&xyz);
        r.func();
    }
    
[/code]

であるとき  
\- この `class A` を使って変数を作ることはできない ( `A a;` はダメ)  
\- 同様 `B b;` もダメ (基底クラスである `A` のインスタンスが生成できないので)  
\- （もし変数が作れたならば） `a.func();` のような呼び出しはできる  
\- コンストラクタを経由せず無理やり変数っぽいものや参照を作ったなら `r.func();`
のような呼び出しはできる（正しく構築されていないので絶対に動かないけど）

※通常、自動変数は自動的に構築破棄されるので暗黙のうちにコンストラクタ・デストラクタの呼び出しが生成されるが `private`
なのでクラス外からは呼べない。

* * *
[code]

    class A {
    protected:
        A() { } /* protected コンストラクタ */
        virtual ~A() { } /* protected デストラクタ */
    public:
        virtual void func() const;
    };
    class B : public A {
    public:
        B() { } /* public コンストラクタ */
        ~B() { } /* public デストラクタ : 暗黙のうちに virtual である */
    };
    
[/code]

であれば `A a;` なる変数定義はできないけど `B b;` なる変数定義はできるっす。同様 `b.func();` であるとか `A& ra=b;`
としておいて `ra.func();` なる呼び出しは可能っす。  
※ `protected` なら派生クラス内部からは呼べる

ということで sayuri さんの補足としておきたいっす。


CC BY-SA 4.0
2018-11-16T01:22:42.997
50370
2018-11-16T06:02:31.757
2018-11-16T06:02:31.757
8589
8589
50356
answer