默认关键字虚析构函数

3
我越来越多地使用C++11,发现一些找不到答案的问题。当我们通过基类指针删除派生类时,需要有虚析构函数;但有时父类析构函数需要是“纯虚的”,这在C++中并不是真正可能的。所以,我的问题是:能否使用default来定义虚析构函数?我已经尝试过了,它确实可以工作,但我不知道它是否安全,因为互联网上没有任何信息。

编辑:为了澄清问题,我正在讨论使用virtual ~Class() = default;


2
virtual ~Class() = 0;这个语言中还没有被移除。 - Hans Passant
未定义的符号:架构x86_64: “Component ::〜Component()”,引用自:PhysicsComponent ::〜PhysicsComponent()中的PhysicsComponent.o - 当我使用纯虚函数时发生这种情况。 - Gasim
@Gasim,你仍然需要为它指定一个实现,因为它将总是被调用。 - Yam Marcovic
那么使用纯虚拟析构函数有什么意义呢?它是为了在编译期间强制派生类具有析构函数吗?如果是这样的话,那不是我需要的。使用 virtual ~Class()=default; 是否是合法的 C++ 语法? - Gasim
@Gasim:即使类没有其他虚纯方法,拥有一个纯虚析构函数也会使该类成为抽象纯类。顺便说一下,= default 是合法的 C++11 语法。 - Jarod42
@Gasim:所以你的问题只是:virtual ~Class() = default; 是否合法?如果是,答案是肯定的。 - Jarod42
2个回答

6

虚析构函数 ~Base() = default; 是否合法?

是的,它是合法的。

如果你想要一个纯虚析构函数,可以这样做:

class Base
{
public;
    virtual ~Base() = 0;
};

并提供实现:
Base::~Base() = default; // or any other implementation

所以,Base 是虚纯函数。在 C++11 之前可以使用 {} 替换 = default; 来实现。


我的目标不是拥有一个纯虚析构函数。我更喜欢使用=default而不是{},主要是为了命名。 - Gasim

3
在这种情况下,更简单的方法是使用virtual ~Class() {}。它具有相同的含义,更短,并且您不需要处理实现问题。 = default主要用于复制/移动构造函数/赋值运算符,而不是析构函数。

它并不具有相同的意义。如果没有其他纯虚函数,则该类将不再是抽象的。 - Lightness Races in Orbit
1
@LightnessRacesinOrbit 如果你使用 {}=default 中的任何一个,它就不会是纯的。 - Gasim
1
哦,抱歉,我看成了= 0。我想我没有看到编辑。那么,是的,这是一个好建议。 :) - Lightness Races in Orbit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接