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

Posted

技术标签:

【中文标题】多继承 C++ 中的覆盖方法【英文标题】:Override method in multi inherite 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 我看到您没有接受任何问题的答案。如果答案对您有帮助,请单击旁边的小复选标记将其标记为“已接受”。这有助于贡献者更轻松地找到未回答的问题。谢谢! 【参考方案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()

【讨论】:

以上是关于多继承 C++ 中的覆盖方法的主要内容,如果未能解决你的问题,请参考以下文章

C++多态

C++多态

C++之多态总结(多态的定义及实现,抽象类,多态原理,单继承,多继承中的虚函数表)

C++多态详解

C++多态详解

C++——多态