更优选哪种类型的继承?

Nov*_*ice 7 c++ inheritance design-patterns

实现第二种情况的唯一要点是,如果我想从一个Collidable派生而不是一个对象?如果是这种情况,那么第一种情况何时有利,因为第二种情况提供了更大的灵活性.

两个collidables只有一个纯虚函数,Object是可以在屏幕上绘制的对象的基类(在我的例子中).

^假设我正确理解以下代码(我不太确定TBH)

class Object
class CollidableObject : Object
class Actor : public CollidableObject

class Object
class Collidable
class Actor : public Object, public Collidable
Run Code Online (Sandbox Code Playgroud)

编辑:

基于Matt/Seth

class Object
class Collidable
class Clickable
class Trackable
class BlowUppable
class Actor : public Object, public Collidable, public Clickable, public Trackable,
              public BlowUppable

class SomeObjectThatIsTakenForGrantedThatEverythingElseIsInherited : public Actor
Run Code Online (Sandbox Code Playgroud)

第一个例子是第二个案例,第二个例子是第一个案例.我想这是我在第一种情况下看到的唯一用途.

@Luchian
这是一个与原文不同的问题,因为你的答复都不是.

在这种情况下,是否存在将对象从is-a更改为has-a关系的差异?在每种情况下,为了检查冲突,对象必须有一个标志来知道是否应该检查冲突.在您的情况下,可以检查成员是否为null,但在派生的情况下,对象本身会告诉它是否可以发生碰撞.在数组/树中,我可以将派生对象作为参数传递,或者使用get()方法将hitbox作为参数传递.

为了更深入,我有另一个类 - 使用第二个案例

class Hitbox : public Object, public Collidable
Run Code Online (Sandbox Code Playgroud)

而Actor类将它作为成员

class Actor : public Object
{
     Hitbox *box;
};
Run Code Online (Sandbox Code Playgroud)

碰撞的对象会有一个hitbox,而这正好代表了你的帖子.但是我仍然感觉到的是,当我再次回顾你的例子时,它是否意味着Hitbox应该有一个Collidable成员呢?

class Hitbox
{
     Collidable *collision;
};
Run Code Online (Sandbox Code Playgroud)

我拥有:
一个Actor拥有一个处理碰撞的Hitbox

Hitbox应该做什么: 作为成员
继承Collidable或
具有Collidable

演员已经遵循你的约定了.Hitbox应该这样做吗?

Mat*_*att 2

我会做第二种情况,因为ObjectCollidable是跨领域的关注点。如果你走这CollidableObject条路,你最终可能会遇到类的组合爆炸。不久之后您就会看到CollidableTrackableClickableBlowuppableObject.

由于Collidable是纯虚拟的,因此在本例中它被用作接口,因此没有很多反对多重继承的批评。您只是简单地声明一个 Actor 实现了该Collidable接口。