C ++中的纯虚析构造函数

时间:2009-03-10 16:02:25

标签: c++ polymorphism destructor pure-virtual

写错了:

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

是否为抽象基类?

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

2 个答案:

答案 0 :(得分:201)

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

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

inline A::~A() { }

应该足够了。

由于这得到了投票,我应该澄清:如果你从A派生任何东西,然后尝试删除或销毁它,A的析构函数最终将被调用。由于它是纯粹的并且没有实现,因此将产生未定义的行为。在一个流行的平台上,它将调用purecall处理程序并崩溃。

编辑:修复声明更符合,使用http://www.comeaucomputing.com/tryitout/编译

答案 1 :(得分:46)

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

  

12.4析构函数

     

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

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

  

10.4抽象类

     

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

     

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

从草案中直接采取:

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