【问题标题】:What is the purpose of pure virtual destructor? [duplicate]纯虚析构函数的目的是什么? [复制]
【发布时间】:2011-10-14 23:10:33
【问题描述】:

可能的重复:
Under what circumstances is it advantageous to give an implementation of a pure virtual function?
Why do we need a pure virtual destructor in C++?

Base 具有纯virtual 析构函数时,编译器不会强制Child class 实现析构函数。

struct Base
{
  virtual void foo () = 0;
  virtual ~Base() = 0;
};
Base::~Base() {} // necessary

struct Child : Base
{
  void foo() {}
  //ok! no destructor needed to create objects of 'Child'
};

有趣的是;编译器宁愿强制Base 定义析构函数体。 Which is understood。 (Demo供参考)

那么在Base 类中拥有virtual 析构函数目的是什么? (只是为了禁止Base创建对象吗?)

【问题讨论】:

  • Child 有一个默认构造函数。
  • @Luc,我的问题中已经提到了这个答案。想知道有没有其他目的
  • @iammilind:对不起,但我不完全理解这个问题。拥有虚拟析构函数有明显的目标(例如,正确的删除)。我们希望将此属性传递给后代,并在 Base 中声明虚拟 dtor。但是,我们在这个~Base() 中没有任何事情要做。为什么我们需要提供任何类型的虚拟 dtor 的身体?所以拥有纯虚拟 dtor 似乎很自然。或者问题是关于“在 Child 中没有明确的 dtor 的情况下它如何工作?”)?还是我错过了什么?

标签: c++ destructor language-lawyer pure-virtual


【解决方案1】:

它使类抽象。至少一个纯虚方法的存在就足以让一个类成为抽象类。

【讨论】:

    【解决方案2】:

    有时抽象基类没有虚拟方法(= 通常称为“mixin”)或根本没有方法(= 通常称为“类型标记”) .

    要强制将这些类用作抽象基类,至少有一个方法需要是纯虚拟的——但是这些类没有虚拟方法!所以我们将析构函数设为纯虚函数。

    【讨论】:

      【解决方案3】:

      如果Base 中没有任何其他纯虚函数,您可以选择将析构函数设为纯虚函数,这样基类仍然是抽象的。

      它实际上确实强制派生类实现析构函数,但如果你不提供,编译器会为你做。


      好吧,也许我可以用更好的措辞来表达。第二段回复:

      Base 具有纯virtual 析构函数时,编译器不会强制Child class 实现析构函数。

      我可能想说虚析构函数(无论是否纯)导致派生类也有一个虚析构函数,无论是你编写还是编译器编写。

      【讨论】:

      • It actually does force the derived class to implement a destructor,but the compiler will do that for you if you don't provide one. 相互矛盾
      • @iammilind:它们并不矛盾。该类需要有一个析构函数。编译器提供了一个析构函数。很好。
      • 严格来说,Bo 错了:基类中存在纯虚析构函数并不会强制派生类实现析构函数;它是一个类的简单事实强制使用析构函数。所有类都有一个析构函数。总是。
      【解决方案4】:

      编译器不会强制 Child 类在以下情况下实现析构函数 它的 Base 有纯虚析构函数。

      不,如果您没有明确定义,Compiler 确实会为 Child 类生成一个默认析构函数(该析构函数又调用 Base 类的纯虚拟析构函数的实现)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-08-05
        • 2011-06-16
        • 2014-02-02
        • 2015-08-09
        • 2010-11-10
        • 2010-10-12
        相关资源
        最近更新 更多