纯虚拟析构函数的目的是什么?

时间:2011-07-28 09:25:46

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

  

可能重复:
  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++?

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

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供参考)

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

4 个答案:

答案 0 :(得分:27)

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

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

答案 1 :(得分:14)

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

答案 2 :(得分:3)

如果Base中没有任何其他纯虚函数,则可以选择使析构函数为纯虚拟,以便基类仍然是抽象的。

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


好吧,也许我可以说得更好。第二段回复:

  

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

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

答案 3 :(得分:2)

  

编译器不强制Child类在何时实现析构函数   它的Base有纯虚析构函数。

不,编译器会为Child类生成一个默认的析构函数(如果你没有明确定义它,它会调用类Base的纯虚析构函数的实现)。