默认析构函数可以自动生成为虚拟析构函数吗?
如果我定义了一个基类,但没有默认析构函数,那么是否会自动生成默认的虚拟析构函数?
默认析构函数可以自动生成为虚拟析构函数吗?
如果我定义了一个基类,但没有默认析构函数,那么是否会自动生成默认的虚拟析构函数?
不需要。定义虚方法会带来额外的成本,而C++的哲学是不让你为未明确使用的东西付出代价。如果虚析构函数自动生成,你将自动支付代价。
那么为什么不只是定义一个空的虚析构函数呢?
在C++11中,您可以使用:
class MyClass
{
// create a virtual, default destructor
virtual ~MyClass() = default;
};
default
与使用空构造函数{}
有什么区别? - Zitrax是的,通过继承具有虚析构函数的基类来实现。在这种情况下,您已经为多态类(例如vtable)付出了代价。
Uri和Michael是正确的 - 我只想补充一点,如果你不喜欢要触碰两个文件来声明和定义析构函数,那么在头文件中内联定义一个最小化的析构函数是完全可以的:
class MyClass
{
// define basic destructor right here
virtual ~MyClass(){}
// but these functions can be defined in a different file
void FuncA();
int FuncB(int etc);
}
目前,Uri是正确的。但是,在您的类中声明虚拟方法后,您仍然要为虚拟表的存在付出代价。实际上,如果您的类具有虚拟方法,但没有虚拟析构函数,编译器会发出警告。这可能成为自动生成默认虚拟析构函数的候选项,而不是烦人的警告。
有些人说它从不默认为虚拟的。这并不完全正确。
尽管析构函数不会被继承,但如果基类声明其析构函数为虚拟的,则派生析构函数始终会覆盖它。
这意味着如果基类有一个虚拟析构函数,您不必将派生类的析构函数定义为虚拟的,也不必显式编写:
/// All of these are unnecessary and won't change the destruction behavior
/// as long as Class inherits from a base class with a virtual destructor
virtual ~Class() = default;
// or
~Class() override = default;
// or
~Class() {}
public: ~MyClass() {}
- 即使类成员默认为私有。 - MSalters