多继承 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<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->getName()
时,编译器不知道该选择哪一个。要解决此问题,请使用virtual inheritance
。
简单地说,在B
和C
两个类中派生你的类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++ 中的覆盖方法的主要内容,如果未能解决你的问题,请参考以下文章