gpt4 book ai didi

c++ - novtable 接口(interface)中的虚拟析构函数可以吗?

转载 作者:搜寻专家 更新时间:2023-10-31 01:14:59 25 4
gpt4 key购买 nike

我有一个 Visual Studio 2008 C++03 项目,其中有一个声明为 _declspec( novtable ) 的接口(interface)类。例如:

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 的接口(interface)类中调用函数。 “如果您尝试实例化标有 novtable 的类,然后访问类成员,您将收到访问冲突 (AV)。”所以添加一个 virtual ~IFoo() { }; 成员听起来像是一件坏事。 (虽然在我的测试中,它似乎工作正常。)

如何正确地从中获得所需的行为?

最佳答案

在您的接口(interface)类中包含一个虚拟析构函数应该没问题。您已经包含了另一个虚拟方法并调用了它,因此析构函数应该没有什么不同。

novtable 的效果是 IFoovtable 没有被初始化。不过没关系,因为您永远不会直接实例化 IFoo。相反,您实例化该类的后代。后代有一个 vtable,那个 vtable 使用指向 Foo(和 IFoo,如果 IFoo 有任何 Foo 不会覆盖的非纯虚方法)。从 Foo 中调用 ~IFoo 是一个非虚拟调度,所以 IFoo 的 vtable 仍然不是必需的。

关于c++ - novtable 接口(interface)中的虚拟析构函数可以吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10640693/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com