如果我有一个带有虚拟析构函数的基类。有一个派生类来声明一个虚拟析构函数吗?
class base {
public:
virtual ~base () {}
};
class derived : base {
public:
virtual ~derived () {} // 1)
~derived () {} // 2)
};
具体问题:
发布于 2010-02-04 17:04:14
final
来防止它在派生类中被重写,但这并不能阻止它是虚的。,
virtual
关键字或override
。人们不应该在继承层次结构中一直往上爬才能知道函数是虚的。此外,如果您的类是可复制或可移动的,而不必声明自己的复制或移动构造函数,则声明任何类型的析构函数(即使您将其定义为default
)都会强制您声明复制和移动构造函数以及赋值运算符(如果需要的话),因为编译器将不再为您放置它们。注释中指出,如果析构函数未声明,编译器会生成一个默认析构函数(也就是仍然是虚拟的)。这个默认函数是一个内联函数。
内联函数可能会将程序的更多部分暴露给程序的其他部分的更改,并使共享库的二进制兼容性变得棘手。此外,在面对某些类型的更改时,增加的耦合可能会导致大量的重新编译。例如,如果你决定你真的想要一个虚拟析构函数的实现,那么调用它的每一段代码都需要重新编译。然而,如果您在类体中声明它,然后在.cpp
文件中将其定义为空,则无需重新编译就可以更改它。
我个人的选择仍然是在可能的情况下忽略它。在我看来,它弄乱了代码,编译器有时可以用默认实现而不是空实现来做一些更有效的事情。但是,你可能会受到一些限制,这使得这不是一个好的选择。
发布于 2010-02-04 17:06:40
与所有方法一样,
’的等价物)
发布于 2010-02-04 17:04:25
虚成员函数将隐式地使此函数的任何重载都是虚的。
所以1)中的虚函数是“可选的”,基类析构函数是虚的,使得所有子析构函数也都是虚的。
https://stackoverflow.com/questions/2198379
复制相似问题