C+笔记八十一:继承和组合混搭下的构造和析构

依法编程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】先析构自己,再析构成员变量,最后析构基类。也就是先构造的对象后释放。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180915A0UWOK00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券