多重继承是邪恶的吗?

时间:2008-12-13 07:05:31

标签: oop multiple-inheritance

  

可能重复:
  What is the exact problem with multiple inheritance?

为什么在实现多个接口时多重继承被认为是 evil ?特别是当曾经认为接口只是纯抽象类时?

(或多或少)重复 What is the exact problem with multiple inheritance?Multiple Inheritance in C#以及其他一些......

4 个答案:

答案 0 :(得分:28)

多重继承的常见问题是“钻石问题”。

  A
 / \
B   c
 \ /
  D

如果A中的虚拟方法由B和C实现,那么在创建D时会得到哪一个?

这不是接口问题的原因是因为接口没有实现,所以如果A / B / C都是接口,那么D选择如何以适当的方式实现A方法。

答案 1 :(得分:13)

它被认为是邪恶的,因为它比人们通常期望的更复杂并引发更多问题,特别是在基类不是纯粹抽象的情况下(没有数据成员)。可以使用虚拟继承来解决钻石继承,其中共享基础。编译器可以捕获方法签名冲突。很好用,它可以生成优雅和干燥的解决方案,否则通过界面和组合/授权实现更加冗长。

C ++中常见的MI习惯用于复杂的包装器构造函数,其中基本构造函数需要使用非平凡的成员对象构造,并且由于基础对象需要在成员对象之前构造,因此诀窍是使用MI(“基础”从成员“idiom。”,否则你必须使用工厂和更多的步骤来像Java一样进行构造(Java没有用于非接口类的MI)。

不要害怕它并在适当的时候使用它(尽管可能需要一些练习才能找到合适的颜色)。

答案 2 :(得分:3)

对于一个罕见的问题,MI并不是一个非常邪恶的解决方案。在大多数情况下,有更好的方法来完成同样的事情。

答案 3 :(得分:2)

如果A实现了一个名为z的方法,并且b实现了一个名为z的方法,你如何协调:

孩子:a,b

现在,如果我的客户端代码调用new child()。z()。正在调用哪个实现?我不认为它的邪恶只是提出了很多棘手的点并且没什么价值