12
/*Child is inherited from Parent*/
class Parent {  
  public:  
    Parent () //Constructor
    {
        cout << "\n Parent constructor called\n" << endl;
    }
  protected:
    ~Parent() //Dtor
    {
        cout << "\n Parent destructor called\n" << endl;
    }
};

class Child : public Parent 
{
  public:
    Child () //Ctor
    {
        cout << "\nChild constructor called\n" << endl;
    }
    ~Child() //dtor
    {
        cout << "\nChild destructor called\n" << endl;
    }
};

int main ()
{
    Parent * p2 = new Child;          
    delete p2;
    return 0;
}

Parentのデストラクタを仮想化するとエラーになるのですが、保護されたデストラクタを仮想化する目的は何ですか?

4

4 に答える 4

20

一例を挙げると、参照カウントを実装する基本クラスがあるとします。addRefとメソッドがあり、 の呼び出しによって内部カウンターがゼロに達した場合 (およびその場合にのみrelease) 、オブジェクトを破棄したいとします。release

したがって、最初にデストラクタを保護する必要があります (オブジェクトを 内からのみ破棄するためrelease)。

クラスから派生することを計画している場合は、デストラクタを仮想にすることも必要です。これは、基本クラスへのポインタを介して子オブジェクトを破棄する場合は常に仮想デストラクタが必要だからです (@sharptooth のヒントに感謝します ...)

于 2012-01-23T11:12:11.163 に答える
6

はい、COM オブジェクトで実装するときに非常に一般的なメンバー関数でdelete this行う場合。class ParentIUnknown::Release()

于 2012-01-23T11:09:32.420 に答える
4

protected: Base::~Base();BaseBaseまたは派生クラスから派生したオブジェクトを削除する (計画している) 場合は、少なくとも仮想である必要がありますBase

于 2012-01-23T11:06:15.977 に答える