3 回答
TA贡献1865条经验 获得超7个赞
允许纯虚拟析构函数的真正原因可能是,禁止它们意味着在语言中添加另一条规则,并且不需要此规则,因为允许纯虚拟析构函数不会带来任何不良影响。
不,普通的旧虚拟就足够了。
如果使用默认实现为其虚拟方法创建对象,并希望使其抽象而不强迫任何人重写任何特定方法,则可以将析构函数设为纯虚拟。我看不出很多意义,但是有可能。
请注意,由于编译器将为派生类生成隐式析构函数,因此,如果类的作者不这样做,则任何派生类都不会是抽象的。因此,在基类中具有纯虚拟析构函数不会对派生类产生任何影响。它只会使基类成为抽象类(感谢@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.
};
TA贡献1887条经验 获得超5个赞
您需要的抽象类至少是一个纯虚函数。任何功能都可以;但是碰巧的是,析构函数是任何类都会拥有的东西-因此它始终是候选对象。此外,使析构函数为纯虚拟的(而不是纯虚拟的)除了使类抽象之外,没有行为方面的副作用。因此,许多样式指南建议始终使用纯虚拟destuctor表示类是抽象的—如果出于其他原因,它提供了一致的位置,那么阅读代码的人可以查看该类是否是抽象的。
TA贡献1796条经验 获得超4个赞
如果要创建抽象基类:
这不能被实例化(是的,这是多余的与术语“抽象”!)
但需要虚拟析构函数的行为(您打算携带指向ABC的指针,而不是指向派生类型的指针,并通过它们进行删除)
但并不需要任何其他虚拟调度其他方法的行为(也许还有有没有其他的方法呢?考虑一个简单的受保护的“资源”的容器,它需要一个构造函数/析构函数/分配,但仅此而已)
...最简单的方法是使析构函数成为纯虚函数,并为其提供定义(方法主体),从而使类抽象。
对于我们假设的ABC:
您保证无法实例化它(即使是在类本身内部,这也就是为什么私有构造函数可能不够用),您可以得到析构函数所需的虚拟行为,而不必查找和标记另一个不需要将虚拟调度作为“虚拟”。
- 3 回答
- 0 关注
- 1052 浏览
添加回答
举报