1. ホーム
  2. c++

[解決済み] C++で抽象クラスに対して仮想デストラクタを宣言する理由は何ですか?

2022-04-23 05:04:39

質問

C++でベースクラスに対して仮想デストラクタを宣言するのは良い習慣だと思いますが、常に virtual デストラクタは、インターフェイスとして機能する抽象クラスであっても有効ですか?その理由と例を教えてください。

解決方法は?

インターフェイスの場合はさらに重要です。あなたのクラスのユーザは、おそらく具象実装へのポインタではなく、インターフェイスへのポインタを保持することになるでしょう。それを削除しようとしたとき、もしデストラクタが仮想でなければ、派生クラスのデストラクタではなく、インターフェースのデストラクタ(または、指定しなかった場合は、コンパイラが提供するデフォルト)を呼び出すことになるでしょう。即座にメモリーリークが発生します。

例えば

class Interface
{
   virtual void doSomething() = 0;
};

class Derived : public Interface
{
   Derived();
   ~Derived() 
   {
      // Do some important cleanup...
   }
};

void myFunc(void)
{
   Interface* p = new Derived();
   // The behaviour of the next line is undefined. It probably 
   // calls Interface::~Interface, not Derived::~Derived
   delete p; 
}