- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有一个 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
的效果是 IFoo
的 vtable 没有被初始化。不过没关系,因为您永远不会直接实例化 IFoo
。相反,您实例化该类的后代。后代有一个 vtable,那个 vtable 使用指向 Foo
(和 IFoo
,如果 IFoo
有任何 Foo
不会覆盖的非纯虚方法)。从 Foo
中调用 ~IFoo
是一个非虚拟调度,所以 IFoo
的 vtable 仍然不是必需的。
关于c++ - novtable 接口(interface)中的虚拟析构函数可以吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10640693/
我开始考虑在我 future 的项目或重构中实现控制反转容器,我想知道在正确设计依赖项时哪些原则(除了 GoF 模式)可能需要牢记在心。假设我需要构建一个简单的控制台应用程序,如果它可以访问互联网,它
假设我有一个 RxC contingency table 。这意味着有 R 行和 C 列。我想要一个维度为 RC × (R + C − 2) 的矩阵 X,其中包含行的 R − 1 “主效应”以及列的
我正在尝试使用 DKMS 为正在运行的内核 (4.4) 构 build 备树覆盖。我天真的 Makefile 如下: PWD := $(shell pwd) dtbo-y += my-awsome-o
我有一个 sencha touch 项目。我是用 phonegap 2.9 构建的,并且可以正常工作 device.uuid 返回到设备 ID。当我尝试使用 3.1 device.uuid 构建时抛出
我在安装了 Xcode 4.5.1 的 Mt Lion 上运行。 默认情况下,当我构建并部署到 iOS 5.1 设备时,显示会在我旋转设备时旋转,但当我部署到 iOS 6 模拟器或运行 iOS 的 i
我正在尝试使用 Google Analytics Reporting API v4 构建多折线图。 一张图表,其中我按每天的 session 计数为每个设备(台式机/平板电脑/移动设备)设置了一条线。
我一生都无法使用 xcode 组织者“自动设备配置”中的“团队配置配置文件”在 xcode 4.0.1 中将我的应用程序构建到我的 iPad 上。 该应用程序完美地构建到模拟器,但当我构建到 iPad
我是一名优秀的程序员,十分优秀!