Adr*_*ian 3 c++ inheritance virtual-destructor
每个人都说当至少有一个类方法是虚拟的时,析构函数应该是虚拟的.
我的问题是,在使用向上转换时说析构函数应该是虚拟的是不正确的?
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;
}
Run Code Online (Sandbox Code Playgroud)
我在这段代码中没有任何虚函数,但是如果我不使我的基础析构函数为虚拟,它就不会调用B析构函数.是的,我知道如果我没有虚函数,使用ucpasting是没有意义的.
谢谢.
当至少有一个类方法是虚拟的时,析构函数应该是虚拟的
这是一个经验法则,这是因为当您使用虚函数时,您正在使用运行时多态并且更有可能遇到这种情况,如果您拥有的是一个类,那么您需要销毁一个可能是派生类型的类.指向其基类子对象的指针.
通过delete在指向基类的指针上销毁派生对象时,基类中需要使用虚拟析构函数以避免未定义的行为.这是虚拟析构函数唯一需要的时间,该指南旨在帮助避免出现这种情况.
Herb Sutter提倡指导基类析构函数(即设计为继承的类的析构函数)应该是public和virtual/ protected或非virtual.这允许您不希望基类成为继承层次结构中用于删除派生对象的点,并且您希望强制执行此操作不会无意中发生.
当然,如果你有一个纯值类,它不是一个基类,你几乎无法阻止人们从它派生,然后通过指向base的方法删除派生类.
| 归档时间: |
|
| 查看次数: |
648 次 |
| 最近记录: |