我有一个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() { };
成员听起来可能是个坏主意。(尽管在我的测试中,它似乎工作得很好。)
如何正确地获得所需的行为?
FooDo
,但它是纯虚函数并没有实现;而析构函数不能是纯虚函数,必须有一个实现(即使是空的)。我的担心是这种差异会符合“调用类成员”的标准。 - PaulH