[英]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.