首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么要在C++中避免多重继承?

为什么要在C++中避免多重继承?
EN

Stack Overflow用户
提问于 2009-01-02 05:09:36
回答 13查看 89.3K关注 0票数 176

使用多重继承是一个好的概念,还是我可以做其他事情呢?

EN

回答 13

Stack Overflow用户

发布于 2009-01-02 20:05:37

interview with Bjarne Stroustrup

的人说得很对,你不需要多继承,因为你可以用多继承做的任何事情,你也可以用单继承做。您只需使用我提到的委派技巧即可。此外,您根本不需要任何继承,因为您使用单个继承所做的任何事情都可以通过类转发,而无需继承。实际上,您也不需要任何类,因为您可以使用指针和数据结构来完成所有这些工作。但是你为什么要这么做呢?什么时候可以方便地使用语言工具?您希望在什么情况下采取变通方法?我见过多重继承有用的案例,甚至还见过相当复杂的多重继承有用的案例。通常,我更喜欢使用该语言提供的工具来解决

问题

票数 147
EN

Stack Overflow用户

发布于 2009-01-02 05:18:41

没有理由避免它,而且它在某些情况下非常有用。不过,您需要意识到潜在的问题。

最大的一个是死亡之钻:

代码语言:javascript
运行
复制
class GrandParent;
class Parent1 : public GrandParent;
class Parent2 : public GrandParent;
class Child : public Parent1, public Parent2;

现在,您在Child中有两个GrandParent的“副本”。

不过,C++已经考虑到了这一点,并允许您进行虚拟继承来绕过这些问题。

代码语言:javascript
运行
复制
class GrandParent;
class Parent1 : public virtual GrandParent;
class Parent2 : public virtual GrandParent;
class Child : public Parent1, public Parent2;

始终检查您的设计,确保您没有使用继承来节省数据重用。如果你可以用组合来表示同样的事情(通常你可以),这是一种更好的方法。

票数 38
EN

Stack Overflow用户

发布于 2009-01-02 05:18:40

参见w:Multiple Inheritance

多重继承受到了批评,因此在许多语言中都没有实现。批评包括:

  • 增加了类的多义性,通常被总结为diamond problem.
  • Not能够显式地多次从单个类继承
  • 继承顺序更改类语义。

具有C++/Java风格构造函数的语言中的多重继承加剧了构造函数和构造函数链的继承问题,从而在这些语言中产生了维护和可扩展性问题。继承关系中的对象在构造方法变化很大的情况下很难在构造函数链范例下实现。

解决这个问题的现代方法是使用接口(纯抽象类),如COM和Java接口。

我可以做其他的事情来代替这个吗?

可以,停那儿吧。我要去偷GoF的东西。

接口的Implementation

  • Prefer组合程序,而不是

上的继承组合

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/406081

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档