c – 使用向上转换时的虚拟析构函数
每个人都说当至少有一个类方法是虚拟的时,析构函数应该是虚拟的.
我的问题是,在使用向上转换时说析构函数应该是虚拟的是不正确的? class A { public: ~A(){ cout << "Destructor in A" << endl; } }; class B: public A { public: ~B(){ cout << "Destructor in B" << endl; } }; int main() { A* a = new B; cout << "Exiting main" << endl; delete a; } 我在这段代码中没有任何虚函数,但是如果我不使我的基础析构函数为虚拟,它就不会调用B析构函数.是的,我知道如果我没有虚函数,使用ucpasting是没有意义的. 谢谢. 解决方法
这是一个经验法则,这是因为当您使用虚函数时,您正在使用运行时多态并且更有可能遇到这种情况,如果您拥有的是一个类,那么您需要销毁可能属于派生类型的类.指向其基类子对象的指针. 通过在指向基类的指针上使用delete来销毁派生对象时,基类中必须使用虚拟析构函数以避免未定义的行为.这是虚拟析构函数唯一需要的时间,该指南旨在帮助避免出现这种情况. Herb Sutter提出了基类析构函数(即设计为继承的类的析构函数)应该是公共的和虚拟的,或者是受保护的和非虚拟的.这允许您不希望基类成为继承层次结构中用于删除派生对象的点,并且您希望强制执行此操作不会无意中发生. 当然,如果你有一个纯值类,它不是一个基类,你几乎无法阻止人们从它派生,然后通过指向base的方法删除派生类. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |