关于函数析构+虚函数

来源:百度知道 编辑:UC知道 时间:2024/07/07 11:57:36
class A{
public:A(){cout<<"A"<<endl;}
virtual ~A(){cout<<"~A"<<endl;} //去掉virtual结果是A B ~A
};
class B:public A{
public: B(){cout<<"B"<<endl;}
~B(){cout<<"~B"<<endl;}
};
void main(){
A *p= new B;
delete p;
}
结果:A B ~B ~A
这个结果是怎么出来的

普通函数加上virtual,就相当于如果子类也有同名函数,那么调用子类的函数。如果不加virtual,那么如果是父类的对象,就会直接调用父类的该函数。实现的方式是虚函数表。

析构函数有它的特殊性吧。我也不知道是如何实现的。不过这也没有什么关系。事实上写程序必须要按照标准来搞。析构函数一定要加virtual.相当于说,本来是一个错误的做法,你还探究它运行的原理。

研究研究是挺有趣的,不过实际是不会用到的。

调用构造函数时先调用父类的构造函数,再调用本类声明中的对象的构造函数,最后调用自己的构造函数。析构函数的调用顺序与之相反