Bjarne:为何析构函数默认不是virtual

Bjarne:为何析构函数默认不是virtual,第1张

Bjarne:为何析构函数默认不是virtual,第2张

因为很多类并没有被设计成基类。虚函数只有当一个类在行为上是其派生类的接口时才有意义(这些派生类往往是在堆中分配的,通过指针或引用来访问)。

那么析构函数什么时候应该定义为虚的呢?当一个类至少有一个虚函数时。拥有虚函数意味着一个类是派生类的接口。在这种情况下,派生类的对象可能被基类指针破坏。例如:

基类{
//...
virtual ~ Base();
};

派生的类:公共基{
//...
~ Derived();
};

void f()
{
Base * p = new Derived;
删除p;//虚析构函数确保~派生函数被调用
}

如果基类的析构函数不是虚的,那么派生类的析构函数就不会被调用——这可能会产生不好的结果,比如派生类的资源不会被释放。

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » Bjarne:为何析构函数默认不是virtual

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情