/**
*cppTest-8.2:虚析构函数探究&父类和子类的构造函数与析构函数的调用顺序
*
@@总结:
构造函数调用顺序:
基类->子类->子类的子类......
析构函数调用顺序:
基类<-子类<-子类的子类......
*author 炜sama
*/
#include<iostream.h>
class color{
public:
//构造函数不能定义为虚函数!
color(){cout<<"color()"<<endl;}
//@@如果这里的释放函数不是虚函数,那么对于delete p[0]、delete p[1]、delete p[2],
//都只调用color的释放函数,因为p[i]是color类指针。
//这将导致实际为red和bright_red类对象编写的释放函数没有得到正确的调用而不能释放它们的类对象。
virtual ~color(){cout<<"~color()"<<endl;}
};
class red:public color{
public:
red(){cout<<"red()"<<endl;}
~red(){cout<<"~red()"<<endl;}
};
class bright_red:public red{
public:
bright_red(){cout<<"bright_red()"<<endl;};
~bright_red(){cout<<"~bright_red()"<<endl;};
};
void main()
{
color *p[3];
cout<<"新建对象,观察构造函数的调用顺序:"<<endl;
//@@1构造函数调用顺序为从最基类到子类!!!
p[0]=new red;
p[1]=new bright_red;
p[2]=new color;
cout<<"删除对象,观察析造函数的调用顺序:"<<endl;
//@@虚析构函数调用顺序与上面相反!!!
delete p[0];//在调用color的释放函数前调用red的释放函数
delete p[1];//在~color()和~red()调用前调用~bright_red()
delete p[2];//调用~color()
//如果把父类的虚析构函数的virtual去掉,上面的情况就完全不同了:只会调用color的析构函数!
cout<<"red对象指针指向red对象的情况"<<endl;
red *r=new red;//同@@1
delete r;//不管父类析构函数是否为虚函数,这里的效果都不变:从子类到父类的顺序调用析构函数。可见虚析构函数主要在多态时起作用!
}
cppTest-8.2:虚析构函数探究&父类和子类的构造函数与析构函数的调用顺序
最新推荐文章于 2021-09-12 16:03:39 发布