大家帮我看看这个C++程序啊!

来源:百度知道 编辑:UC知道 时间:2024/07/03 03:58:28
#include "iostream.h"
class base
{
protected:
int privatel;
public:
base(int p){privatel=p;}
};
class derived1:virtual public base
{
public:
derived1(int p1):base(p1){};
int get_privater(){return privatel;}
};
class derived2:virtual public base
{
public:
derived2(int p2):base(p2){};
int get_privater(){return privatel;}
};
class derived12:public derived1,public derived2
{
public:
derived12(int p1,int p2,int pb):derived1(p1),derived2(p2),base(pb){};
};
void main()
{
derived12 d(10,20,30);
cout<<"privatel from derived1:"<<d.derived1::get_privater();
cout<<"\nprivatel from derived2:"<<d.derived2::get_privater();
cout<<"\n";
}
为什么输出是30,30?我觉得应该是10,20啊,derived1和derived2分别对应的是10和20阿
你讲的关于虚继承的我都懂了,可是在调用构造函数derived12::derived12(int,int,int)时总是按照

虚继承中每个子类只有一份它们的虚基类的拷贝,所以不管是在derived1、derived2还是derived12中,他们的的数据成员private1都只有唯一的一个,而没有另外的拷贝。你可以返回private1的引用来看出:

derived1::int& get_privater(){return privatel;}
derived2::int& get_privater(){return privatel;}

cout<< "privatel from derived1: "<< &d.derived1::get_privater();
cout<< "\nprivatel from derived2: "<< &d.derived2::get_privater();

你会发现它们的地址是相同的,既对于虚基类中的private1它们没有另外的拷贝,各个类人手一份。

所以在这句中:

derived12(int p1,int p2,int pb)
:derived1(p1), derived2(p2), base(pb)
{
};

虚基类在最后构造,derived1(p1), derived2(p2), base(pb)都是对derived12中的同一个数据成员private1初始化,所以derived2用p2来初始化private1时把derived1用p1初始化的值给覆盖掉了,同样base(pb)也把p2初始化的private1覆盖掉。所以最后其值为30。如果你这样:

derived12(int p1,int p2,int pb)
:base(p1), derived1(pb), derived2(p2)
{
};

那么你测试的结果就都是p1的值。

我故意不按顺序写就意在告诉你对于使用虚继承的基类来说是个例外,因为一般的继承基类的部分都是在子类部分构造之前构造,但虚基类如果有数据成员那