簡體   English   中英

多重繼承,還是其他?

[英]Multiple inheritance, or something else?

假設我有以下繼承樹:

SDLBullet inherits from Bullet inherits from Entity
EnemyBullet inherits form Bullet inherits from Entity

現在,我需要一個新類SDLEnemyBullet,該類需要在SDLBullet中實現的繪制以及在EnemyBullet中實現的碰撞。 我該怎么做? 是否可以使用多重繼承解決? 如果沒有,請隨時編輯我的問題和標題。 如果是這樣,我將如何實施?

以下是一些代碼示例:

class Entity {
  bool collision(Entity) = 0;
  void draw() = 0;
}

class Bullet : Entity {
  bool collision(Entity) {/*some implementation*/};
  void draw() {/*draw me*/};
}

class SDLBullet : Bullet {
  void draw() {/*draw me using SDL*/};
}

class EnemyBullet : Bullet {
  bool collision(Entity) {/*if Entity is a fellow enemy, don't collide*/};
}

class SDLEnemyBullet : ????? {
  /*I need SDLBullet::draw() here*/
  /*I need EnemyBullet::collision(Entity) here*/
  /*I certainly do not want EnemyBullet::draw nor SDLBullet::collision here*/
}

任何幫助深表感謝!

(順便說一句:這是一個學校項目,並且向我們建議了這樣的繼承樹。沒有人阻止我們做得更好和更好。這就是為什么我問這個問題。)

教科書解決方案涉及多重繼承和虛擬繼承。

class SDLBullet : public virtual Bullet {
  void draw() {/*draw me using SDL*/};
};

class EnemyBullet : public virtual Bullet {
  bool collision(Entity) {/*if Entity is a fellow enemy, don't collide*/};
};

class SDLEnemyBullet : public SDLBullet, public EnemyBullet {
  // just one Bullet subobject here
};

通常,碰撞的東西是使用多次調度完成的,或者在C ++中使用訪問者模式來完成,而C ++沒有此功能。

為什么您沒有這樣的層次結構呢?

class Entity;

class Bullet : public Entity
{
public:
 virtual draw();
}

class FriendlyBullet : public Bullet
{
public: 
bool collide(EnnemyBullet*);
bool collide(FriendlyBullet*);
}
class EnnemyBullet : public Bullet
{
public:
 bool collide(EnnemyBullet*);
bool collide(FriendlyBullet*);
}

這也將起作用,並且不需要多次調度或多重繼承

您需要指定用逗號分隔的超類列表:

class SDLEnemyBullet : public SDLBullet, public EnemyBullet {
  /*I need SDLBullet::draw() here*/
  /*I need EnemyBullet::collision(Entity) here*/
  /*I certainly do not want EnemyBullet::draw nor SDLBullet::collision here*/
}

看來您正在制作游戲(引擎)。 為了避免像這樣的復雜繼承結構需要實體優先於實體繼承,即擁有一個實體對象,該實體對象包含單獨的“組件”對象以進行渲染等。這樣,您可以隨意混合和匹配組件,而無需增加類的數量與超類的所有不同組合。

這是一篇有關該主題的好文章: http : //cowboyprogramming.com/2007/01/05/evolve-your-heirachy/

優先考慮組成而不是繼承

您不需要繼承就可以組合不相關的內容。 組成用於游戲邏輯,物理,聲音,輸入,圖形(可能使用繼承)的基本對象(實體?),然后將這些對象組合在一起,該GameObject僅包含所述對象的數組。

一些漂亮的交叉鏈接很有用,因為它們都共享一個Frame或Transform,但是可以在創建過程中通過遍歷所有其他對象並使用dynamic_cast來完成...(如果不需要依賴初始化順序,則很有用) 。

但是,實際上沒有必要使用繼承來構建它。 它不適合您的用例。 (盡管虛擬繼承很有用,但是使用繼承來迫使不同的事物成為同一事物不是一件好事,即使所有事物成為事物,而不是由不同的部分(渲染,損壞,聲音等)組成。 )。

閱讀更多的信息,或者直接點擊標題,以谷歌為它。 :)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM