首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么我们在C++中需要一个纯虚拟析构函数?

为什么我们在C++中需要一个纯虚拟析构函数?
EN

Stack Overflow用户
提问于 2009-08-02 19:27:29
回答 11查看 99.7K关注 0票数 168

我理解使用虚拟析构函数的必要性。但是为什么我们需要一个纯虚拟析构函数呢?在C++的一篇文章中,作者提到,当我们想要使类抽象时,我们使用纯虚拟析构函数。

但是我们可以通过将任何成员函数作为纯虚函数来使类成为抽象的。

所以我的问题是

  1. ,我们什么时候才能真正让析构函数成为纯虚的呢?有人能给出一个好的实时例子吗?

  1. 当我们创建抽象类时,将析构函数也设为纯虚构函数是一种好的做法吗?If yes..then为什么?
EN

回答 11

Stack Overflow用户

回答已采纳

发布于 2009-08-02 19:30:39

  1. 可能允许纯虚拟析构函数的真正原因是,禁止它们将意味着向语言中添加另一个规则,并且没有必要使用此规则,因为允许纯虚拟析构函数不会产生任何不良影响。

如果您使用其虚方法的默认实现创建了一个对象,并且希望使其成为抽象对象而不强制任何人覆盖任何特定于方法,则可以将析构函数设为纯虚的。我看不出这有多大意义,但这是可能的。

请注意,由于编译器将为派生类生成隐式析构函数,因此如果类的作者不这样做,任何派生类都将不是抽象的()。因此,在基类中使用纯虚拟析构函数不会对派生类产生任何影响。它只会让基类变得抽象(感谢@kappa的评论)。

还可以假设每个派生类都可能需要特定的清理代码,并使用纯虚拟析构函数作为提醒来编写一个,但这似乎是人为的(且未强制执行)。

注意:析构函数是唯一的方法,即使它是纯虚函数,也有实现以实例化派生类(是的,纯虚函数也可以有实现)。

代码语言:javascript
复制
struct foo {
    virtual void bar() = 0;
};

void foo::bar() { /* default implementation */ }

class foof : public foo {
    void bar() { foo::bar(); } // have to explicitly call default implementation.
};
票数 128
EN

Stack Overflow用户

发布于 2009-08-02 22:03:20

抽象类所需要的就是至少一个纯虚函数。任何函数都可以;但是碰巧的是,析构函数是任何类都会有的东西--所以它总是作为候选函数存在。此外,将析构函数设为纯虚的(而不仅仅是虚的)除了使类抽象之外,没有任何行为上的副作用。因此,许多风格指南建议一致地使用纯虚拟destuctor来指示类是抽象的-如果没有其他原因,只是因为它提供了一个一致的位置,阅读代码的人可以查看类是否是抽象的。

票数 33
EN

Stack Overflow用户

发布于 2009-08-02 20:14:25

如果要创建抽象基类:

虚析构函数不能被实例化(是的,这与术语"abstract"!)

  • but需要虚析构函数行为是多余的(您打算携带指向ABC的指针,而不是指向派生类型的指针,并通过它们删除)
  • 不需要其他方法的任何其他虚拟分派<>E211>行为(可能没有其他方法?考虑一个简单的受保护的“资源”容器,它需要一个构造函数/析构函数/赋值函数,但不需要太多其他东西)

...通过使析构函数成为纯虚的并为其提供定义(方法体)来使类成为抽象的类是最容易的。

对于我们假设的ABC:

你保证它不能被实例化(甚至在类本身的内部,这就是私有构造函数可能不够的原因),你得到了你想要的析构函数的虚拟行为,并且你不必找到另一个不需要虚拟分派的方法并将其标记为“虚拟”。

票数 21
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1219607

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档