C++ 虚基类

来源:百度知道 编辑:UC知道 时间:2024/05/14 17:03:26
类A里有成员x
类B继承A
类C继承A
类D继承B,C
D(int a,int b):public b(a),public c(b)//这里都是初始化x
由于编译器无法确定是有B还是由C调用A的构造函数,所以x为缺省值。。。这我可以理解
但是如果改成:
D(int a,int b):public b(a)
这里为什么x依然是缺省值呢?不是可以确定由B调用A的构造函数吗?
以下结论为在构造函数中打印所得

D(int a,int b):public b(a),public c(b),public a(a)//这样可以x=a

D(int a,int b):public b(a) //测试发现仍然调用了C的构造函数,为什么?

D(int a,int b):public b(a),public c(b)//这样是不调用A的,为什么?

在构造函数中加打印,看调用顺序啥

有可能类B和类C继承类A是虚拟继承,就会这样。我曾经看过一片文章。
class A
{A(int i){x=i};
public: int x;
};
class B:public virtual A
{B(int i,int k):A(i)
{b=k;}
public:int b;
};
class C:public virtual A
{C(int i,int k):A(i)
{c=k;}
public:int c;
};

class D:public B,public C
{D(int i,int k,int j):B(i,k),C(i,j)
{d=j;}
public: int d;
};

像上面这种情况,基类A的构造函数A()就不会被他的派生类B或C调用。
而要用下面这种方式才能被调用
class D:public B,public C
{D(int i,int k,int j):B(i,k),C(i,j),A(i)
{d=j;}
public: int d;
};
基类A的构造函数被调用了,A类中的成员就不会再是默认值了。我估计你的问题应该是这个问题

不能确定,归根到底两个函数都要调用A类的构造函数去初始化X,
D(int a,int b):public b(a)
把这里的b改为大写B