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


Answers:


218

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

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

inline A::~A() { }

应该足够了。

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

编辑:修正声明以使其更符合要求,并使用http://www.comeaucomputing.com/tryitout/进行编译


16
嗯是的 纯仅意味着派生类也需要提供实现。
MSN

72
实际上,实现纯虚拟功能是合法的。对于提供默认实现但强制子类显式调用它非常有用。
jmucchiello

6
MSN,请注意,如果标头中包含该定义,则需要在其前面加上“内联”,以避免违反ODR(一种定义规则)
Johannes Schaub-litb

2
为什么我必须明确定义A ::〜A(),因为我认为每个对象都有一个默认析构函数?就像在任何类型的继承中一样,始终调用析构函数链,而不必始终定义基类析构函数。
jeffD

11
更好的说法是,一旦声明了析构函数,它就不会自动为您实现。
MSN

49

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

12.4析构函数

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

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

10.4抽象类

2仅当使用合格ID语法(5.1)或如同(12.4)那样调用纯虚函数时,才需要定义纯虚函数。

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

直接从草稿中获取:

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

14
+1。我认为Herb Sutter在此方面也有一些不错的信息:gotw.ca/gotw/031.htm。有趣的是,任何纯虚函数都可以提供实现,而不仅仅是析构函数。
Fred Larson

6
是的,这是您在面试中做的,会让您的面试官
发疯

1
根据我的经验,这实际上并不少见。

@Neil Butterworth:哪一个?
2009年

@Dirk-“任何功能”方案。发现它用于实现一些常见的行为并不少见。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.