依法编程Autocodes
欢迎各位小伙伴关注”依法编程“,一起交流
继承和组合混搭,就是说程序中含有类的继承,一个类的对象作另一个类的成员属性,这两种情况同时出现的时候,构造函数和析构函数的调用顺序问题。
看程序:
#include
usingnamespacestd;
classobj
{
public:
obj(inta,intb)
{
cout
this->a=a;
this->b=b;
}
~obj()
{
cout
}
protected:
inta;
intb;
private:
};
classAnimal:publicobj
{
public:
Animal(char*p):obj(1,2)//初始化列表
{
this->p=p;
cout
}
~Animal()
{
cout
}
protected:
char*p;
private:
};
classDog:publicAnimal
{
public:
Dog(char*pt):Animal(pt),c1(1,2),c2(3,4)
{
this->myp=pt;
cout
}
~Dog()
{
cout
}
protected:
char*myp;
obj c1;
obj c2;
private:
};
voidplay()
{
Dog d1("继承测试");
}
intmain()
{
play();
system("pause");
return0;
}
运行结果:
obj构造函数调用a:1b:2
类Animal的构造函数继承测试
obj构造函数调用a:1b:2
obj构造函数调用a:3b:4
类Dog的构造函数继承测试
类Dog的析构函数继承测试
obj类的析构函数
obj类的析构函数
类Animal的析构函数继承测试
obj类的析构函数
请按任意键继续. . .
单步调试程序,我们发现构造和析构函数的调用顺序是:
【1】调用最外层的基类obj的构造函数;
【2】由外层到内层调用构造函数,也就是调用类Animal的构造函数;
【3】调用成员变量(另一个类定义的对象做成员变量)对应类的构造函数;
【4】调用自身的构造函数,也就是Dog类的构造函数;
【5】析构顺序与构造顺序相反,先构造后析构。
结论:
【1】先构造基类,再构造成员变量(组合类),最后构造自己;
【2】先析构自己,再析构成员变量,最后析构基类。也就是先构造的对象后释放。
领取专属 10元无门槛券
私享最新 技术干货