我有一个 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() { };
成员听起来可能是一件坏事。(虽然在我的测试中,它似乎工作正常。)
如何正确地从中获得所需的行为?