C + + 中的纯虚析构函数

写道:

class A {
public:
virtual ~A() = 0;
};

抽象基类?

至少在 MSVC 中编译... 它会在运行时崩溃吗?

83397 次浏览

是的,您还需要实现析构函数:

class A {
public:
virtual ~A() = 0;
};


inline A::~A() { }

应该够了。

如果您从 A 中获取任何内容,然后尝试删除或销毁它,那么最终将调用 A的析构函数。由于它是纯粹的,而且没有实现,未定义行为将随之而来。在一个流行的平台上,这将调用 puretechandlder 并导致崩溃。

编辑: 修改声明使其更符合 http://www.comeaucomputing.com/tryitout/编译

私有析构函数: 当您创建派生类的对象时,它们会给您一个错误——否则不会。不过,可能会出现一种诊断。

12.4毁灭者

6析构函数可以声明为虚(10.3)或纯虚(10.4) ; 如果在程序中创建了该类的任何对象或任何派生类,则应定义析构函数。

具有纯虚析构函数的类是抽象类。 请注意:

10.4抽象类

2只有在使用限定 -id 语法(5.1)或类似于使用(12.4)调用时,才需要定义纯虚函数。

[ 注意: 函数声明不能同时提供纯说明符和定义ー end 注]

直接从草案中摘录:

struct C {
virtual void f() = 0 { }; // ill-formed
};