| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 722 人关注过本帖
标题:构造函数的调用次序
只看楼主 加入收藏
norlan
Rank: 1
等 级:新手上路
帖 子:25
专家分:0
注 册:2007-5-3
收藏
 问题点数:0 回复次数:5 
构造函数的调用次序
为什么结果是CBase1 class
CBase2 class
CDerive2 class

CBase2 cass
CDerive1 class
CTop class
而不是

CBase1 class
CBase2 class
CDerive2 class
CBase1 class
CBase2 cass
CDerive1 class
CTop class



#include<iostream.h>
class CBase1
{
public:
CBase1()
{cout<<"CBase1 class!\n";}
};
class CBase2
{
public:
CBase2(){cout<<"CBase2 class!\n";}
};
class CDerive1:public CBase2,virtual public CBase1
{
public:
CDerive1()
{cout<<"CDerivel class\n";}
};
class CDerive2:public CBase2,virtual public CBase1
{
public:
CDerive2()
{cout<<"CDerive2 class\n";}
};
class CTop:public CDerive1,virtual public CDerive2
{
public:
CTop()
{cout<<"CTop class\n";}
};
void main()
{ CTop topobj; }
搜索更多相关主题的帖子: class 函数 构造 color 
2007-06-26 11:08
norlan
Rank: 1
等 级:新手上路
帖 子:25
专家分:0
注 册:2007-5-3
收藏
得分:0 
哪位帮我看一下
2007-06-28 12:44
余来
Rank: 6Rank: 6
等 级:贵宾
威 望:26
帖 子:956
专家分:18
注 册:2006-8-13
收藏
得分:0 

这个是多重继承中的一个问题,CBase1两次继承,分别是CDerive1继承了CBase1,
CDerive2也继承了CBase1,而最后的Top又继承了CDerive1和CDerive2,所以继承了两次而导致错误,
所以需要在被继承的时候,设置成vistual继承方式,这样就只继承了一次,所以它不会调用两次


2007-06-28 13:21
海子123
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2007-7-1
收藏
得分:0 
要好好研究下
virtual的含义
2007-07-01 15:50
yunxiang_myx
Rank: 1
等 级:新手上路
威 望:1
帖 子:17
专家分:0
注 册:2007-7-6
收藏
得分:0 

执行到CTOP()的时候,不存在虚函数了.
只按照父子关系依次执行成员函数所以就没有CB1了

2007-07-07 00:49
yunxiang_myx
Rank: 1
等 级:新手上路
威 望:1
帖 子:17
专家分:0
注 册:2007-7-6
收藏
得分:0 

我简写了.
先CTOP的虚函数V CD2,由CD2到V CB1.输出CB1.再回到CD2成员函数,由CD2到CB2..输出CB2,再输出CD2.
再执行CTOP()由于继承了CD1,而CD1继承了CB2.所以先执行CB2输出CB2,再到CD1输出CD1.最后是CTOP.
不知道你明白了没?


可以理解成虚函数优先.......成员函数访问不用访问虚函数.

2007-07-07 00:55
快速回复:构造函数的调用次序
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.032018 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved