20

可能的重复:
在什么情况下给出一个纯虚函数的实现是有利的?
为什么我们需要 C++ 中的纯虚析构函数?

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

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定义一个析构函数体。这是明白的。(演示供参考)

那么在课堂上使用析构函数的目的是什么?(仅仅是为了禁止创建对象吗?)virtualBaseBase

4

4 回答 4

29

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

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

于 2011-07-28T09:31:22.663 回答
15

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

于 2011-07-28T09:29:14.467 回答
3

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

它实际上确实强制派生类实现析构函数,但如果您不提供析构函数,编译器会为您执行此操作。


好吧,也许我可以更好地表达这一点。第二段回复:

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

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

于 2011-07-28T09:32:45.050 回答
2

当其 Base 具有纯虚拟析构函数时,编译器不会强制 Child 类实现析构函数。

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

于 2011-07-28T10:52:32.453 回答