C++|继承+组合关系下的构造和析构
继承+组合关系下的构造和析构 理解Inheritance(继承)+Composition(组合)关系下的构造和析构顺序,有利于我们深入理解C++的内存布局。
先看第一种情况
文章图片
子类继承父类又与普通类进行组合,可以用代码举例找出答案,各位博友们可以直接复制代码到编译器下运行。
#include
using namespace std;
//父类
class Base {public: Base() {cout << "Base::构造" << endl;
}
~Base() {cout << "~Base::析构" << endl;
}
};
class Comp {public:
Comp() {cout << "Comp::构造" << endl;
}
~Comp() {cout << "~Comp::析构" << endl;
}};
//子类
class Der :public Base
{public:
Comp c;
//这里Comp c不论放在构造析构下面还是上面,运行结果都一样
Der() {cout << "Der::构造" << endl;
}
~Der() {cout << "~Der::析构" << endl;
}
};
void Test1() { Der d;
//Base构造-》Comp构造-》Der构造-》Der析构-》Comp析构-》Base析构
}int main(void) { Test1();
return 0;
}
运行结果如下:
文章图片
【C++|继承+组合关系下的构造和析构】可见这种继承+组合的情况下,先构造父类再构造组合类最后构造子类,析构与之相反,为什么析构顺序相反呢?
可以这样理解,因为这些函数都是在栈区中,类似数据结构中的栈,栈的特性是先进后出,后进先出,所以析构顺序与构造相反。
再看第二种情况
文章图片
父类与普通类进行组合,子类又继承父类,同样用代码找出答案。
#include
using namespace std;
class Comp {public:
Comp() {cout << "Comp::构造" << endl;
}
~Comp() {cout << "~Comp::析构" << endl;
}};
//父类
class Base {public:
Comp c;
Base() {cout << "Base::构造" << endl;
}
~Base() {cout << "~Base::析构" << endl;
}
};
//子类
class Der :public Base
{public:
Der() {cout << "Der::构造" << endl;
}
~Der() {cout << "~Der::析构" << endl;
}
};
void Test2() { Der d;
//Comp::构造->Base::构造->Der::构造->~Der::析构->~Base::析构->~Comp::析构
}
int main(void) { Test2();
return 0;
}
运行结果如下:
文章图片
这个构造顺序就容易理解了,Base类中有Comp类,自然先构造Comp,再构造Base,最后再构造Der,析构顺序同样相反。
推荐阅读
- opencv|opencv C++模板匹配的简单实现
- C语言学习|第十一届蓝桥杯省赛 大学B组 C/C++ 第一场
- 21天|21天|羊多多组合《书都不会读,你还想成功》
- c++基础概念笔记
- 2018-08-29|2018-08-29 - 草稿 - 草稿
- Python-类和对象
- R语言|R语言 函数
- 牛逼!C++开发的穿越丛林真人游戏,游戏未上线就有百万人气
- C++Primer之|C++Primer之 函数探幽
- c/c++|有感 Visual Studio 2015 RTM 简介 - 八年后回归 Dot Net,终于迎来了 Mvc 时代,盼走了 Web 窗体时代...