在C++中,每个人都知道基类的析构函数通常必须是虚拟的。但是派生类的析构函数呢?在C++11中,我们有关键字“override”和显式使用默认析构函数的能力。
struct Parent
{
std::string a;
virtual ~Parent()
{
}
};
struct Child: public Parent
{
std::string b;
~Child() override = default;
};
在子类的析构函数中同时使用关键字"override"和"=default",这样做是否正确?编译器会生成正确的虚析构函数吗?
如果是,那么我们可以认为这是良好的编码风格,我们应该总是以这种方式声明派生类的析构函数,以确保基类析构函数是虚拟的吗?
static_assert(std::has_virtual_destructor<Parent>::value, "contract violated");
。 - milleniumbug~Child() override = default;
,我可能会直接删除这行。 - juanchopanzaoverride
的意义——唯一的意义——就是在父类方法不是virtual
时强制编译器报错。那么,static_assert
怎么算是一种改进呢? - Kyle Strandstatic_assert
,只是它比override
版本更加令人困惑。这是真的,因为它更长、更啰嗦,并且使用了标准库中相对较为晦涩的特性。 - Kyle Strand