【问题标题】:Override method in multi inherite C++多继承 C++ 中的覆盖方法
【发布时间】:2014-05-25 01:14:01
【问题描述】:

我在 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->显示数据(); // 我希望它打印“ABCD”,但它打印“ABACD”

问题2:

coutgetName(); // 它显示错误:'getName'的模糊访问

你能帮我解决两个问题吗? 谢谢。

【问题讨论】:

  • 这不是有效的 C++ 代码。请发布可编译的代码。但是,如果您按照代码进行操作,您应该会看到为什么它会打印输出 ABACD
  • cout&lt;getName 在您的 Problem2 中也无效。问题 1 准确地打印出它应该打印的内容:D 调用 B,它调用 A,它打印 A。然后 B 打印 B,然后 D 调用 C 调用 A,A 打印 A,然后 C 打印 C,然后 D 打印 D 。结果:ABACD,正是你要求它做的事情。
  • d调用getName方法,但是D继承了B和C,B和C都包含getName这个问题怎么解决?
  • @user1956702 我看到您没有接受任何问题的答案。如果答案对您有帮助,请单击旁边的小复选标记将其标记为“已接受”。这有助于贡献者更轻松地找到未回答的问题。谢谢!

标签: c++ inheritance overriding


【解决方案1】:

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

简单地说,在BC 两个类中派生你的类A 实际上

class A { ... }

class B : public virtual A { ... }

class C : public virtual A { ... }

class D : public B, public C { ... }

这保证了 D 类中 A 类的单个嵌入副本,并将解决模棱两可的访问错误。

至于问题 1,虚拟继承将是一个好的开始,但您需要找到一些方法来重新设计您的逻辑,以便在您调用 D::getName() 时不会调用两次 A::getName()

【讨论】:

    猜你喜欢
    • 2016-01-25
    • 1970-01-01
    • 2012-11-20
    • 2016-06-04
    • 2012-05-08
    • 1970-01-01
    • 2013-08-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多