【问题标题】:What is the purpose of adding a defininition for a pure-virtual destructor?为纯虚拟析构函数添加定义的目的是什么?
【发布时间】:2011-03-10 17:46:10
【问题描述】:

灵感来自:C++ -- why should we define the pure virtual destructor outside the class definition?

下面的代码实际上做了什么?

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

Object::~Object() { /*...*/ }

我认为纯虚函数的意义在于强制子类实现该特定功能。如果是这样,那为什么还要在虚拟基类中实现相同的功能呢?

【问题讨论】:

  • 我无法评论纯虚析构函数,但总的来说纯虚函数的定义提供了default实现,派生类可以显式地选择执行!
  • @Nawaz:那是虚函数。我很少实现一个虚函数,而且在过去的十年里肯定没有这样做过。除了必须实现的纯虚拟析构函数。
  • @sbi:我说的是纯虚函数,派生可以选择运行!
  • @Nawaz:我考虑在覆盖基类虚拟时调用它们是可疑的,即使不是纯的。您是否必须将其称为 beforeafter 您自己的实现?还是在中间?还是您必须这样做?我完全赞成never。这太容易了。鉴于此,实现纯虚函数的用例是什么?

标签: c++ destructor pure-virtual


【解决方案1】:

此代码阻止您创建 Object 的实例,同时允许您创建子类。

销毁对象时,会调用父类的析构函数,所以它必须存在。这适用于析构函数是否是纯虚拟的。纯虚成员函数只有在显式调用时才需要定义,Foo:theFunc()

【讨论】:

  • 谢谢,埃里克。这很有意义。
  • 类似于将所有构造函数设为私有吗?
  • 私有构造函数阻止您继承,而不是实例化(例如从静态成员)
【解决方案2】:

在纯虚析构函数的情况下,没有办法“强制”任何人在派生类中实现它。编译器会为你写一个。此外,编译器编写的析构函数(在派生类中)会调用父析构函数——所以你最好为父类编写一个实现。

所以,总结一下:

  1. 非析构函数的纯虚函数不需要实现,因为您不希望程序员调用它。
  2. 纯虚析构函数必须有一个实现,因为编译器必须从子类中的析构函数(程序员和编译器都编写)调用它。

【讨论】:

    猜你喜欢
    • 2021-12-09
    • 2011-10-14
    • 2015-11-12
    • 1970-01-01
    • 2015-08-09
    • 2011-10-29
    • 2014-08-05
    • 2014-02-12
    • 2016-01-22
    相关资源
    最近更新 更多