这样写有没有错:

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
};
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top