C++ 中的纯虚拟析构函数
-
08-07-2019 - |
题
这样写有没有错:
class A {
public:
virtual ~A() = 0;
};
对于抽象基类?
至少可以在 MSVC 中编译...运行时会崩溃吗?
解决方案
是。您还需要实现析构函数:
class A {
public:
virtual ~A() = 0;
};
inline A::~A() { }
应该足够了。
由于这得到了投票,我应该澄清:如果你从A派生任何东西,然后尝试删除或销毁它,最终将调用
的析构函数。由于它是纯粹的并且没有实现,因此将产生未定义的行为。在一个流行的平台上,它将调用purecall处理程序并崩溃。
编辑:修改声明更符合,使用 http://www.comeaucomputing.com/tryitout编译/
其他提示
私有析构函数:当您创建派生类的对象时,它们会给您一个错误——否则不会。但可能会出现诊断结果。
12.4 析构函数
6 析构函数可以声明为虚函数(10.3)或纯虚函数(10.4);如果程序中创建了该类或任何派生类的任何对象,则应定义析构函数。
具有纯虚析构函数的类是抽象类。请注意:
10.4 抽象类
2 仅当使用或如同使用 (12.4)、限定 ID 语法 (5.1) 调用时才需要定义纯虚函数。
[笔记:函数声明不能同时提供纯指定器和定义 - 末尾注释
直接取自草稿:
struct C {
virtual void f() = 0 { }; // ill-formed
};
不隶属于 StackOverflow