Visual Studio 2008 C ++ 03プロジェクトがあり、宣言されたインターフェイスクラスがあります_declspec( novtable )
。例えば:
class _declspec( novtable ) IFoo
{
public:
virtual void FooDo() const = 0;
};
class Foo : public IFoo
{
public:
~Foo() { printf( "~Foo()\r\n" ); };
void FooDo() const { printf( "FooDo()\r\n" ); };
};
int main( int argc, char* argv[] )
{
IFoo* foo = new Foo();
foo->FooDo();
delete foo;
return 0;
}
IFoo
仮想デストラクタがないため、具象Foo
デストラクタが呼び出されることはありません。
出力:
FooDo()
必要な出力:
FooDo()
~Foo()
しかし、MSDNでは、宣言されたインターフェイスクラスで関数を呼び出すことに対する悲惨な警告がありますnovtable
。「novtableでマークされたクラスをインスタンス化してからクラスメンバーにアクセスしようとすると、アクセス違反(AV)が発生します。」したがって、virtual ~IFoo() { };
メンバーを追加することは悪いことのように思えます。(私のテストでは、うまく機能しているようですが。)
これからどのようにして望ましい振る舞いを適切に得ることができますか?