【问题标题】:Structuring classes with multiple inheritance构造具有多重继承的类
【发布时间】:2013-06-01 15:17:56
【问题描述】:

这不是一个实际的编程问题,我只需要关于如何构建我的程序的一部分的建议。

程序分为客户端和服务器部分。两者共享某些代码,包括基类。这是我遇到问题的代码的表示:

共享课程:

class BaseEntity
{
public:
    virtual void EmitSound(std::string snd) {}
    virtual bool IsPlayer() {return false;}
};

class BasePlayer
    : public BaseEntity
{
public:
    bool IsPlayer() {return true;}
}

服务器端类:

class Entity
    : public BaseEntity
{
public:
    void EmitSound(std::string snd)
    {
        // Serverside implementation
    }
}

class Player
    : public Entity,BasePlayer
{
public:
    void Kick() {}
}

客户端类:

class CEntity
    : public BaseEntity
{
public:
    void EmitSound(std::string snd)
    {
        // Clientside implementation
    }
};

class CPlayer
    : public CEntity,BasePlayer
{
public:
    void SetFOV() {}
}

(这些方法只是示例)

“Player”类应该继承“Entity”和“BasePlayer”的所有成员。但是这不起作用,因为两者都有相同的父类 (BaseEntity)。

我当然可以从“BasePlayer”中删除继承,但最终会得到两个“IsPlayer”函数,每个函数都返回不同的东西。

我还可以将所有成员分别从“BasePlayer”移动到“Player”和“CPlayer”,但这会导致我想避免的冗余,并且我不再能够使用单个指针任一类的对象,同时保持对所有共享方法的访问。

我不喜欢这两种解决方案,但我想不出其他任何方法。 这个问题有最优解吗?

【问题讨论】:

  • 一个“实体”的目的是什么,为什么Player必须从它继承,以及BasePlayer需要从BaseEnttity继承?对我来说,这似乎是不同类的混合,而不是“它应该是的方式”。

标签: c++ structure multiple-inheritance base-class


【解决方案1】:

我认为可以解决您的特定问题的最简单的解决方案是让 BasePlayer 类不继承自 BaseEntity 类。

类 Player 将具有 BaseEntity 类特性,因为它继承自类 Entity 继承自类 BaseEntity,而类 CPlayer 将具有 BaseEntity 类特性,因为它继承自类 CEntity 继承自类 BaseEntity。

【讨论】:

  • 这就是两难境地。 BasePlayer 需要从 BaseEntity 继承,因为 BaseEntity 定义了它的位置和方向(以及更多)。我可能应该在示例中更清楚地说明这一点。
  • @Silverlan,引用position & orientation,仍然没有必要让BasePlayer继承自BaseEntity。如果您已经在引用Player/CPlayer 对象,您将获得免费引用这些positionorientation 的能力,因为您将通过@ 从BaseEntity 继承987654330@ & CEntity,如果你需要独立于BasePlayer的类型来引用它们,那么直接将它们引用为BaseEntity对象......这将更清晰和适当地引用定义@987654333的类@ & orientation,无论如何。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-17
  • 2012-05-26
  • 2017-03-11
  • 1970-01-01
  • 2017-12-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多