首先假定有这样一个状况,有一个基类A(里面有共有数据成员int a),它派生了两个类B1(里面暂时什么也没有),B2(同B1),B1和B2又共同派生了C。现在,我在C中定义一个函数,试图调用A类成员int a,但是这个时候,由于继承的关系,B1继承了A中的int a,同理B2也是,那么C类岂不是继承了B1中继承的A中的int a,也继承了B2中的?!这个时候,如果我单纯地去调用a,那么编译器也会提示二义性的问题。这个时候也就是虚基类,虚继承起作用的时候了。看下面的一段代码:
#include<iostream>
using namespace std;
class A
{
public:
int a;
};
class B1:virtual public A
{
public:
void display(){cout<<a<<endl;}
private:
int b1;
};
class B2:virtual public A
{
public:
void display(){cout<<a<<endl;}
private:
int b2;
};
class C:public B1,public B2
{
public:
C(){a=1;}
void display(){cout<<a<<endl;}
};
int main()
{
C i3;
i3.display();
return 0;
}
#include<iostream>
using namespace std;
class A
{
public:
int a;
};
class B1:virtual public A
{
public:
B1(){a=1;}
void display(){cout<<a<<endl;}
private:
int b1;
};
class B2:virtual public A
{
public:
B2(){a=2;}
void display(){cout<<a<<endl;}
private:
int b2;
};
class C:public B1,public B2
{
public:
void display(){cout<<a<<endl;}
};
int main()
{
B2 i2;
B1 i1;
i1.display();
i2.display();
C i3;
i3.display();
return 0;
}
我给B1,B2都加了构造函数来初始化a,程序结果是依次输出1,2,2(在主函数中调换B1,B2位置也是如此),那么这说明C类对象保留那份a是来自B2构造函数弄出来的。
当我试着对C类进行如下修改:
class C:public B2,public B1 //调换了一下顺序
{
public:
void display(){cout<<a<<endl;}
};
结果是依次输出1,2,1,这说明C类对象保留那份a是来自B1构造函数弄出来的,那个顺序到底是怎么回事?
灵机一闪,如果这样解释:第一个问题中的“C类对象保留那份a是来自B2构造函数弄出来”,这个是因为C中合成的构造函数先调用了B1的再调用B2的,而第二个也同理,按照顺序,那么就讲得通了。。。。。。暗骂自己真傻。。。。