当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《C++中的纯虚析构造函数》经验,为你挑选了2个好方法。

写错是不对的:

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

对于抽象基类?

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



1> MSN..:

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

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

inline A::~A() { }

应该足够了.

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

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


实现纯虚函数实际上是合法的.对于提供默认实现非常有用,但强制子类显式调用它.
嗯,是的.纯只表示派生类也需要提供实现.
更好的方法是,一旦声明了析构函数,它就不会自动为您实现.
MSN并注意如果您在标题中有该定义,则需要在其前面加上"内联"以避免违反ODR(一个定义规则)
为什么我必须明确定义A ::〜A(),因为我认为每个对象都有一个默认析构函数?像在任何类型的继承中一样,始终调用析构函数链,而不必始终定义基类析构函数。
如果要调用基类析构函数,则始终必须对其进行定义。如果您从不删除或显式销毁A的子容器,则无所谓。如果这样做,它确实会。

2> dirkgently..:

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

12.4析构函数

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

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

10.4抽象类

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

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

从草案中直接采取:

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


+1.我认为Herb Sutter也有一些很好的信息:http://www.gotw.ca/gotw/031.htm.有趣的是,任何纯虚函数都可能提供实现,而不仅仅是析构函数.
是的,这是你在采访中做的事情,让你的面试官吓坏了;)
推荐阅读
360691894_8a5c48
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有