__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のうまみが無くなるので。