10

私は、プライベート (そしてもちろんパブリック) デストラクタの使用を認識しています。

また、派生クラスでの保護されたデストラクタの使用についても認識しています。

保護されたデストラクタを使用して、基本クラス ポインターを介した派生オブジェクトの破棄を防止します。

しかし、次のコードを実行しようとしましたが、コンパイルされません。

struct A{
    int i;
    A() { i = 0;}
    protected: ~A(){}
};

struct B: public A{
    A* a;
    B(){ a = new A();}
    void f(){ delete a; }
};


int main()
{
   B b= B();
   b.f();
   return 0;
}

私は得る:

void B::f()':
main.cpp:9:16: error: 'A::~A()' is protected

私は何が欠けていますか?

f() 内から A の保護されたメソッドを呼び出すと、機能します。では、なぜd'torの呼び方が違うのでしょうか?

4

1 に答える 1

13

protectedBのメンバーにアクセスできるという意味ではありませ A。それは、それ自身のベースのメンバーにアクセスできることを意味するだけAです...そして他BAベースのメンバーにもアクセスできます!

これは、private型を持つオブジェクトが常に型を持つ別のオブジェクトのメンバーをA呼び出すことができるとは対照的です。privateA

于 2013-10-19T17:33:59.003 に答える