在C++中,构造函数的次序 按照 基类、成员类
,当前类类的次序进行构造,析构是正好相反。注意 这里是强调的当前类的对象的构造和析构过程。在程序中,如果是临时变量,也就是栈里面的的变量,系统会自动按照这个规律进行。但对于当动态构造的对象,比如new,最后再用delete删除对象,未必按照上面的那个次序进行,比如用基类的指针delete时候,此时是按照基类删除的。和当前类没关系,也就是当前类的析构函数没有被调用。显然这是由于向上影射造成的,解决的方法自然是想到了虚函数。只要把析构函数设置为虚函数。就可以解决这个问题。这个分析可以参看后面的例子。
#include
using namespace std;
class CBase
{
public:
CBase()
{
data = new char[64];
cout<<"cbase 构造"< };
~CBase()
{
delete [] data;
cout<<"cbase 析造"< };
char *data;
};
class CFunction
{
public:
CFunction()
{
cout<<"CFunction 构造"< };
virtual ~CFunction()//虚函数
{
cout<<"CFunction 析造"< };
};
class CFunctionEx : public CFunction
{
public:
CFunctionEx(){
cout<<"CFunctionEx 构造"< };
~CFunctionEx(){
cout<<"CFunctionEx 析造"< };
private:
CBase m_cbase;
};
void main()
{
CFunction *pCFun = new CFunctionEx;
delete pCFun;
//CFunctionEx *pCFun = new CFunctionEx;
//CFunctionEx g;
}
输出结果:
CFunction 构造
cbase 构造
CFunctionEx 构造
CFunctionEx 析造
cbase 析造
CFunction 析造
如果CFunction不是虚函数,则输出
CFunction 构造
cbase 构造
CFunctionEx 构造
CFunction 析造
阅读(2514) | 评论(1) | 转发(0) |