关于多态:C ++中的纯虚析构造函数

Pure virtual destructor in C++

写错了吗:

1
2
3
4
class A {
public:
    virtual ~A() = 0;
};

对于抽象基类?

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


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

1
2
3
4
5
6
class A {
public:
    virtual ~A() = 0;
};

inline A::~A() { }

应该足够了。

既然这次投票失败了,我应该澄清一下:如果你从A中得到任何东西,然后试图删除或销毁它,那么最终会调用A的析构函数。因为它是纯的,没有实现,所以会发生未定义的行为。在一个流行的平台上,它将调用pureCall处理程序并崩溃。

编辑:将声明修改为更符合要求,并使用http://www.comeacucomputing.com/tryitoutouting编译/


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

12.4 Destructors

6 A destructor can be declared virtual (10.3) or pure virtual (10.4); if any objects of that class or any derived class are created in the program, the destructor shall be defined.

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

10.4 Abstract classes

2 A pure virtual function need be defined only if called with, or as if with (12.4), the qualified-id syntax (5.1).

[Note:a function declaration cannot provide both a pure-specifier and a definition —end
note ]

直接从草稿中提取:

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