您的位置:程序门 -> c/c++ -> c++ 语言



【请教】多继承中虚基类构造函数调用的问题


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


【请教】多继承中虚基类构造函数调用的问题
发表于:2008-01-10 01:09:12 楼主
记得c++中建立一个对象使,如果对象中含有从虚基类继承来的成员,则虚基类的成员是由最远派生类的构造函数通过调用虚基类的构造函数进行初始化的。而且,只有最远派生类的构造函数会调用虚基类的构造函数,该派生类的其他基类对虚基类构造函数的调用都自动被忽略。
那么请看下面的代码
#include <iostream>
using   namespace   std;

class   base
{
public:
base(int   i){cout < <i;}
~base(){}
};

class   base1:virtual   public   base
{
public:
base1(int   i,int   j=0):base(j){cout < <i;}
~base1(){}
};

class   base2:virtual   public   base
{
public:
base2(int   i,int   j=0):base(j){cout < <i;}
~base2(){}

};

class   derived:public   base2,public   base1
{
public:
derived(int   a,int   b,int   c,int   d):mem1(a),mem2(b),base1(c),base2(d),base(a)
{
cout < <b;
}
private:
base2   mem2;
base1   mem1;
};

void   main()
{
derived   obj(1,2,3,4);
}

运行结果为1430201
而不是我想的143212,说明base1和base2还是调用了虚基类的构造函数,这是为什么呢?和类的组合有关吗?
小弟刚学c++不久,知识不够扎实,望赐教!
发表于:2008-01-10 08:46:371楼 得分:0
去调那个mem1、mem2再试。试继承就不要参和对象成员。
发表于:2008-01-10 09:03:502楼 得分:0
这个程序似乎是个自身矛盾的测试程序

无论你怎样修改,都是有warnning。而且楼主想测试多重虚继承,本身就已经超级麻烦了,却又弄出来那么多参数,有的竟然还不用,

就像那个j,我是不知道要怎么说...继续关注此贴,学习!
发表于:2008-01-10 09:15:203楼 得分:0
base2       mem2;  
base1       mem1;
这两个要调用虚基类的构造函数

发表于:2008-01-10 16:33:284楼 得分:0

derived       obj(1,2,3,4);  

//derived(int       a,int       b,int       c,int       d):mem1(a),mem2(b),base1(c),base2(d),base(a)   {   cout   <   <b;   }
执行顺序:             输出:  
base(a)               1
base2(d)             4
base1(c)             3
mem2(b)               02
mem1(a)               01
cout   <   <b;         2
发表于:2008-01-10 18:12:075楼 得分:0
基本理解了,谢谢各位~

初始化内嵌对象的时候的确调用了基类的构造函数


快速检索

最新资讯
热门点击