虚基类构造函数调用顺序

虚基类构造函数调用顺序

ID:9941598

大小:21.50 KB

页数:4页

时间:2018-05-16

虚基类构造函数调用顺序_第1页
虚基类构造函数调用顺序_第2页
虚基类构造函数调用顺序_第3页
虚基类构造函数调用顺序_第4页
资源描述:

《虚基类构造函数调用顺序》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、classBase1{public:   Base1(void){   cout<<"classBase1"<

2、e2,virtualpublicBase1{public:   Level2(void){   cout<<"classLevel2"<

3、快说出答案。现在来分析一下在多继承和虚拟继承的情况下,构造函数的调用顺序是怎么样的。编译器按照直接基类在声明中的顺序,来检查虚拟基类的出现情况。在我们的例子中,Level1首先被检查,然后是Level2。每个继承子树按照深度优先的顺序被检查。即,查找从树根类开始,然后向下移动。如对子树Level1而言,先检查Base2,然后是Base1,再到Level1。但是在虚拟继承中,基类构造函数的查找顺序只是为了知道虚拟继承的情况而已,基类构造函数的调用顺序和查找顺序是不一样的,那应该遵循什么样的一个原则呢?遵循两个

4、原则,而且按顺序优先满足:1先调用完所以基类,再调用子类;2先调用虚拟基类,再调用非虚拟基类。一旦调用了虚拟基类的构造函数,则非虚拟基类构造函数就按照声明的顺序被调用。所以针对我们这个例子,因为声明类Leaf的顺序是先Level1后Level2,所以先看看Level1这棵子树吧。由于Level1虚拟继承Base2,非虚拟继承Base1,所以应该先调用Base2,但是这之后不能接着调用Level1这棵子树的Base1,因为其他子树还有虚拟继承。现在来看看Level2这棵子树吧,由于Level2虚拟继承Base

5、1,非虚拟继承Base2,所以先调用Base1,后Base2。既然Level2的两个基类都调用了,并且Level2也是一个虚拟基类,所以现在应该调用Level2的构造函数了。这样,Level2这棵子树的构造函数都调用完了,又回到Level1这棵子树了。接着刚才,由于Level1的Base2已经调用了,接着应该调用Base1了,之后是Level1。当Leaf的所有直接和间接的基类都调用之后,最后是Leaf构造函数了。经过以上分析,大家应该知道构造函数的调用顺序了吧,所以该程序的输出应该是Base2Base1B

6、ase2Level2Base1Level1Leaf

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。