当前位置:  开发笔记 > 编程语言 > 正文

使用多重继承时,如何避免死亡之钻?

如何解决《使用多重继承时,如何避免死亡之钻?》经验,为你挑选了4个好方法。

http://en.wikipedia.org/wiki/Diamond_problem

我知道这意味着什么,但我可以采取哪些措施来避免它?



1> Mark Ingram..:

一个实际的例子:

class A {};
class B : public A {};
class C : public A {};
class D : public B, public C {};

请注意D类是如何从B&C继承的.但是B&C都继承自A.这将导致Vtable中包含2个A类副本.

要解决这个问题,我们需要虚拟继承.它的A类需要实际上是遗传的.所以,这将解决问题:

class A {};
class B : virtual public A {};
class C : virtual public A {};
class D : public B, public C {};


这就是范围.或者,您可以使用D类中的"using"语句.
这只是避免A在内存中两次,它不会避免Diamond造成的任何问题.见http://tinyurl.com/abtjcb; 你如何实现getDepartment,它总是返回正确的东西?你不能!你的设计有缺陷.见http://tinyurl.com/ccjnk6
这个答案不仅适用于您可以控制的课程吗?如果B和C在其他人提供的库中,或者它们是代码库的一部分,则无法更改此"解决方案"根本不起作用.它也违背了OOP的整个原则,即基类不应该关注派生类,但是由于当天晚些时候添加的某些D类,B和C突然不得不改变.

2> eduffy..:

虚拟继承.这就是它的用途.


不是一个完整的答案.

3> Bob Somers..:

我坚持只使用接口的多重继承.虽然类的多重继承有时是有吸引力的,但如果你经常依赖它,它也会让人感到困惑和痛苦.


@Arafangion C++确实有接口,尽管它不是Java中的语言结构.相反,它们只是纯虚拟基类.
我从未遇到过那些不明白这意味着在这种情况下继承纯抽象类的人

4> 小智..:

继承是一种强大而有力的武器.只有在你真正需要时才使用它.在过去,钻石继承是我在分类方面走得很远的一个标志,说用户是"员工",但他们也是"小工具听众",但也是......

在这些情况下,很容易遇到多个继承问题.

我通过使用组合和指针回复所有者来解决它们:

之前:

class Employee : public WidgetListener, public LectureAttendee
{
public:
     Employee(int x, int y)
         WidgetListener(x), LectureAttendee(y)
     {}
};

后:

class Employee
{
public:
     Employee(int x, int y)
         : listener(this, x), attendee(this, y)
     {}

     WidgetListener listener;
     LectureAttendee attendee;
};

是的,访问权限是不同的,但如果您可以摆脱这种方法,而不重复代码,那就更好了,因为它的功能不那么强大.(当你别无选择时,你可以节省电力.)

推荐阅读
echo7111436
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有