Training for D-Day

ブログの内容は個人の見解であり、所属する企業を代表するものではありません。

__interfaceで継承したクラスのデストラクタでハマった

__interfaceで継承したクラスのデストラクタでハマりましたのでメモ。

__intefaceは、MicrosoftのVisual StduioでC++コーディングするときに利用できる文法です。 https://msdn.microsoft.com/ja-jp/library/50h7kwtb.aspx

Interfaceは、C++で言うところの純粋仮想関数の集まりですが、 純粋仮想関数を省力化して記載することができます。

__interfaceを利用しない例

class IDisposable
{
public:
  virtual void Dispose() = 0;
}

__intefaceを利用する例

__inteface IDisposable
{
public:
  void Dispose();
}

※"virutal"と "= 0"を省略できます。

上記を継承。

class DataTableBase : public IDisposable
{
public:
   DataTableBase()
   {
   }

   virutal ~DataTableBase()
   {
   }

   virtual void Dispose()
   {
   }

}

class DataTable : public DataTableBase
{
public:
   DataTable ()
   {
   }

   ~DataTable()
   {
   }

}


で、何がハマったかと言うと、以下の様なコードを書いた場合です。

void method()
{
  IDisposable* p = newDataTable();
  p->Dispose();
  delete p;
}

上記のコードだと、DataTableBaseのデストラクタが呼ばれません。
回避するには以下のようにする必要があります。

void method()
{
 DataTableBase* p = newDataTable();
  p->Dispose();
  delete p;
}

これらに対する回避策は私は見つけられていません。
とりあえず、interfaceのポインタは利用しないようにしています。

できるはずなんですけどね。そうしないと__interfaceのうまみが無くなるので。