我在C ++中看到了这个问题。
class A{
public:
char* getName(){ return "A";}
void showData(){
cout<<"A";
}
};
class B:public A{
public:
void showData(){
A::showData();
cout<<"B";
}
};
class C:public A{
public:
void ShowData(){
A::showData();
cout<<"C";
}
};
class D:public B,public C{
public:
void showData(){
B::showData();
C::showData();
cout<<"D";
}
};
问题1: D * d =新D(); D-&GT; showData(); //我希望它打印“ABCD”,但它打印“ABACD”
Problem2:
COUT&LT;&LT; D-&GT;的getName(); //它显示错误:'getName'的模糊访问
你能帮我解决2个问题吗? 感谢。
答案 0 :(得分:0)
问题2正在发生,因为你的D类包含基类A的两个副本。当你调用d->getName()
时,编译器不知道要接收哪一个。要解决此问题,请使用virtual inheritance
。
简单地说,在A
和B
两个类中派生您的课程C
虚拟:
class A { ... }
class B : public virtual A { ... }
class C : public virtual A { ... }
class D : public B, public C { ... }
这保证了D类中A类的单个嵌入式副本,并将解决模糊访问错误。
对于问题1,虚拟继承将是一个良好的开端,但是您需要找到一些方法来重写逻辑,以便在调用A::getName()
时不会调用D::getName()
两次。