C++ で抽象クラスの仮想デストラクタを宣言する必要があるのはなぜですか? 質問する

C++ で抽象クラスの仮想デストラクタを宣言する必要があるのはなぜですか? 質問する

C++ では基本クラスに仮想デストラクタを宣言するのが良い方法だとわかっていますが、virtualインターフェースとして機能する抽象クラスでもデストラクタを宣言することが常に重要なのでしょうか? 理由と例をいくつか教えてください。

ベストアンサー1

インターフェースの場合はさらに重要です。クラスのユーザーは、具体的な実装へのポインターではなく、インターフェースへのポインターを保持する可能性があります。ユーザーがそれを削除するときに、デストラクタが非仮想である場合、何が起こるかはコンパイラ次第です。

例えば

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 in
   // which case you have a memory leak. Or it may crash
   delete p;
}

おすすめ記事