多继承C ++中的覆盖方法

时间:2014-05-25 01:14:02

标签: c++ inheritance override

我在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个问题吗? 感谢。

1 个答案:

答案 0 :(得分:0)

问题2正在发生,因为你的D类包含基类A的两个副本。当你调用d->getName()时,编译器不知道要接收哪一个。要解决此问题,请使用virtual inheritance

简单地说,在AB两个类中派生您的课程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()两次。