【问题标题】:default keyword virtual destructor默认关键字虚拟析构函数
【发布时间】:2014-01-30 14:04:35
【问题描述】:

我一直在使用越来越多的 C++11,并且遇到了一些我在任何地方都找不到的东西。当我们从基指针中删除派生类时,我们需要有虚析构函数;但有时父析构函数需要是“纯”的,这在 C++ 中是不可能的。那么,我的问题是 default 可以用于虚拟析构函数吗?我已经尝试过它并且它可以工作,但我不知道它是否安全,因为互联网上的任何地方都没有关于它的信息。

编辑:为了澄清问题,我说的是使用virtual ~Class() = default;

【问题讨论】:

  • 这个话题不相关。
  • virtual ~Class() = 0; 尚未从语言中删除。
  • Undefined symbols for architecture x86_64: "Component::~Component()", referenced from: PhysicsComponent::~PhysicsComponent() in PhysicsComponent.o - 当我使用纯虚拟时会发生这种情况
  • @Gasim 你仍然需要为它指定一个实现,因为它总是会被调用。
  • 那么使用纯虚析构函数有什么意义。是否强制派生类在编译期间具有析构函数?如果是,那不是我需要的。正在使用virtual ~Class()=default; 'legal' C++?

标签: c++ c++11


【解决方案1】:

是虚拟的 ~Base() = default;合法

是的。是的。

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

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

并提供实施:

Base::~Base() = default; // or any other implementation

所以Base 是虚拟纯粹的。可以在 C++11 之前完成(将 = default; 更改为 {})。

【讨论】:

  • 我的目标不是拥有一个纯虚拟析构函数。我喜欢使用=default 而不是{},主要用于命名。
【解决方案2】:

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

【讨论】:

  • 确实有同样的意思。如果没有其他纯虚函数,则该类将不再是抽象的。
  • @LightnessRacesinOrbit 如果您使用{}=default,它就不是纯粹的。
  • 哦,对不起,我读的是= 0。没看到我想的编辑。那么,是的,这是一个很好的建议。 :)
猜你喜欢
  • 1970-01-01
  • 2010-10-24
  • 2017-04-21
  • 1970-01-01
  • 2016-03-26
  • 2012-07-14
  • 2010-11-10
  • 1970-01-01
  • 2018-06-29
相关资源
最近更新 更多