http://en.wikipedia.org/wiki/Diamond_problem
我知道这意味着什么,但我可以采取哪些措施来避免它?
一个实际的例子:
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 {};
虚拟继承.这就是它的用途.
我坚持只使用接口的多重继承.虽然类的多重继承有时是有吸引力的,但如果你经常依赖它,它也会让人感到困惑和痛苦.
继承是一种强大而有力的武器.只有在你真正需要时才使用它.在过去,钻石继承是我在分类方面走得很远的一个标志,说用户是"员工",但他们也是"小工具听众",但也是......
在这些情况下,很容易遇到多个继承问题.
我通过使用组合和指针回复所有者来解决它们:
之前:
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; };
是的,访问权限是不同的,但如果您可以摆脱这种方法,而不重复代码,那就更好了,因为它的功能不那么强大.(当你别无选择时,你可以节省电力.)