簡體   English   中英

C++ 設計(多繼承 vs. 列出相關數據)

[英]c++ design (multiple inheritance vs. listing relevant data)

我有

class Skill
{
public :
  virtual void printSkill();
//....
}

class Person : public Skill
{


//...
}

在以前的設計中,每個人可以擁有一項技能,我可以打印出來

Person p;
p.printSkill();

現在我們要添加多個技能並顯示它們。 我變了:

class Person
{
private:
vector<Skill*> m_skills;
pubcic:
void addSkill(Skill *s) { m_skills.push_back(s);}
void printSkills() const { 
  for auto it = m_skills.begin(); it != m_skills.end(); ++it)
  {
      it->printSkill();
  }
}
}
class Skill1 : public Skill
{
   void printSkill() ;
}

class Skill2 : public Skill
{
   void printSkill() ;
}

Person p;
Skill1 s1;
Skill2 s2;
p.addSkill(&s1);
p.addSkill(&s2);

這應該有效但我不喜歡這個。 也許我可以在沒有addSkill方法的情況下解決這個addSkill 使用多重繼承?

什么是最好的取決於很多因素。

使用您的vector<Skill*>版本:

  • 相同的Skill派生對象可以添加到多個Person對象中,這可能是內存高效且可取的,或者不合適的(例如,如果 Skills 對象必須具有Person特定的數據成員,例如技能的范圍,例如 bench-新聞技能可能需要一些特定於Person的公斤數)
  • Skills派生對象的生命周期沒有固有的管理,它必須永遠超過通過您存儲在Person對象中的指向它們的指針對它們的任何使用,否則您將獲得未定義的行為 這可能很好:也許您可以在程序生命周期中創建一定數量的技能一次,並且不需要在所有Person對象的生命周期結束后銷毀它們。 在其他時候,調用代碼將承擔額外的責任和照顧。

其他可能的方法包括:

Person存儲vector<unique_ptr<Skill>> ,並讓客戶端代碼將所有權移交給它添加的技能對象: addSkill(std::make_unique<SomeSkill>(constructor, args, la, de, da);

你也可以using SomeSkill = std::variant<Skill1, Skill2, Skill3>; 並讓Person存儲一個std::vector<SomeSkill> 這實現了與上一個類似的東西,但是在變體中使用了一個足夠大的緩沖區來存儲最大的Skill派生對象,而不是存儲指向動態分配的Skill對象的指針。

您可以使用多重繼承,但是您將有多個基類提供同名函數,並且要調用特定的函數,您必須在當時消除歧義。 如果您希望能夠輕松聲明具有不同技能的Person ,並且仍然有一個printSkills功能可以自動從多個基礎中發現和打印單個技能,那么可以使用可變參數模板和參數包,但是從問題來看 - 恭敬- 你還沒准備好走那條路。

暫無
暫無

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

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