再次遇到烦恼!(高手们帮帮忙吧)

来源:百度知道 编辑:UC知道 时间:2024/05/23 12:56:13
下面是我编的一个程序简略形势,再此程序中,存在两个错误,能讲解一下吗?我想不通为什么呀!!!!(其中C累继承了B类和D类,这样为什么就不能用A类的指针指向C类的对象?如果C类不继承D类就没有任何错误了,到底怎样才能解决此问题呢?)在此我先谢了!!!!!
#include<iostream.h>
class A
{
int x;
public:
h(int q)
{
x=q;
}

virtual void print()
{
cout<<x<<endl;
}
};
class B:public A
{
int c;
public:
B(int q, int r);
void print()
{
cout<<c<<endl;
A::print();
}
};
B::B(int q ,int r)
{
h(q);
c=r;
}
class D:public A
{
int i;
public:
D(int y,int s)
{
i=y;
h(s);
}
void print()
{
cout<<i<<endl;
}
};
class C:public D,public B
{
double v;
public:
C( int y,int s ,int q,int r,double e);
void print()
{
cout<<v<<endl;
A::print();
}
};
C::C(int y,int s,i

C的定义会出现二义性问题,在多继承下,当一个基类在派生层次中出现多次时会有问题。每个C类对象含有两个A子对象:在B子对象中的实例和在D子对象中的实例,这为什么不好?从效率上而言,存储A子对象的两个复本,浪费了存储区,因为C只需要一个实例。而且,A构造函数被调用了两次,因为当调用C的构造函数时,首先调用一次A的构造函数,然后B的,接着,又调用一次A的,然后D的,更严重的问题是由于两个实例引起的二义性,,例如,任何未限定修饰的访问A的成员都将导致编译错误,你这里调用A::print(),由于A中的print是虚函数,由于多态性的原因,将会执行B和D中的print,所以编译器不知道该调用谁的print,所以出现二义性问题,解决这种问题的方法是虚拟继承,不懂的地方再问我

你把B和D的声明改成
class B: virtual public A
class D: virtual public A
就行了

用虚基类做,钱能的《C++程序设计教程》有这个例子