我理解使用虚拟析构函数的必要性。但是为什么我们需要一个纯的虚拟析构函数呢?在C++的一篇文章中,作者提到,当我们想要使类抽象时,我们使用纯虚拟析构函数。
但是我们可以通过将任何成员函数作为纯虚函数来使类成为抽象的。
所以我的问题是
发布于 2009-08-02 19:30:39
如果您使用其虚方法的默认实现创建了一个对象,并且希望使其成为抽象对象而不强制任何人覆盖任何特定于的方法,则可以将析构函数设为纯虚的。我看不出这有多大意义,但这是可能的。
请注意,由于编译器将为派生类生成隐式析构函数,因此如果类的作者不这样做,任何派生类都将不是抽象的()。因此,在基类中使用纯虚拟析构函数不会对派生类产生任何影响。它只会让基类变得抽象(感谢@kappa的评论)。
还可以假设每个派生类都可能需要特定的清理代码,并使用纯虚拟析构函数作为提醒来编写一个,但这似乎是人为的(且未强制执行)。
注意:析构函数是唯一的方法,即使它是纯虚函数,也有实现以实例化派生类(是的,纯虚函数也可以有实现)。
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.
};
发布于 2009-08-02 22:03:20
抽象类所需要的就是至少一个纯虚函数。任何函数都可以;但是碰巧的是,析构函数是任何类都会有的东西--所以它总是作为候选函数存在。此外,将析构函数设为纯虚的(而不仅仅是虚的)除了使类抽象之外,没有任何行为上的副作用。因此,许多风格指南建议一致地使用纯虚拟destuctor来指示类是抽象的-如果没有其他原因,只是因为它提供了一个一致的位置,阅读代码的人可以查看类是否是抽象的。
发布于 2009-08-02 20:14:25
如果要创建抽象基类:
虚析构函数不能被实例化(是的,这与术语"abstract"!)
...通过使析构函数成为纯虚的并为其提供定义(方法体)来使类成为抽象的类是最容易的。
对于我们假设的ABC:
你保证它不能被实例化(甚至在类本身的内部,这就是私有构造函数可能不够的原因),你得到了你想要的析构函数的虚拟行为,并且你不必找到另一个不需要虚拟分派的方法并将其标记为“虚拟”。
https://stackoverflow.com/questions/1219607
复制相似问题