問題是關於C++。我有三類:第一類名爲MovieMaker
,是抽象的,第二類名爲Actor
,源於第一名和第三名,名爲「導演」來自Actor
。我想創建一個可以容納Actor和Director實例的數組。 我該怎麼做?C++繼承數組
C++繼承數組
回答
創建指針陣列MovieMaker
。它可以保存派生類的指針。這種技術被稱爲多態性 - 這裏是一個很好的教程:
cplusplus.com不好,你應該感覺不好 – 2013-03-13 13:14:14
@TonyTheLion - 真的嗎?在使用stackoverflow之前,我多次用它作爲參考。爲什麼這麼糟糕? – WeaselFox 2013-03-13 13:15:10
,因爲它有很多錯誤和錯誤信息。改爲使用en.cppreference.com。 – 2013-03-13 13:16:26
創建的std::shared_ptr<MovieMaker>
,或unique_ptr
數組。在C++中,它通常是一個好主意,以創建一個std::vector
代替原始數組:所以std::vector<std::shared_ptr<MovieMaker>> vec
,你填寫這樣的:
#include <vector>
#include <memory>
// later:
std::vector<std::shared_ptr<MovieMaker>> vec;
vec.push_back(std::make_shared<Actor>());
vec.push_back(std::make_shared<Director>());
vec.push_back(std::make_shared<Actor>());
,或者在C++ 11:
#include <vector>
#include <memory>
// later:
std::vector<std::shared_ptr<MovieMaker>> vec = {
std::make_shared<Actor>(),
std::make_shared<Director>(),
std::make_shared<Actor>(),
};
如果您願意使用第三方庫boost
,還有其他幾個選項。
或者,創建一個boost::variant<Actor,Director>
的數組,它忽略類層次結構,並簡單地存儲類似結構的類型安全的union
。 boost::variant
是有點使用。
作爲另一種替代方案,boost::any
可以存儲任何東西,如果它有什麼是你想要的,你可以查詢它。
也許,如果所有對象都分配在堆上,並且設計需要共享所有權。但這是這個答案中的一個假設,而不是原始問題的一部分。 – 2013-03-13 13:54:12
@PeteBecker這些對象已經在'std :: vector'中,這意味着它們在免費商店中。我在'std :: vector'中添加了一個間接的級別,這對於多態存儲是必需的(除非你像'boost :: variant'或'boost :: any'這樣的技巧)。我選擇'shared_ptr'而不是原始指針,因爲原始指針更復雜。 'unique_ptr'是另一種選擇。我將它存儲在一個'vector'中,因爲'vector'是一個很好的默認容器 - 使用原始數組有很好的理由,但它們都是角落的情況。 – Yakk 2013-03-13 14:13:51
嗯,不,它們不在'std :: vector'中。但是,如果它們是,矢量管理它們的存儲,並且創建指向它們的智能指針('shared_ptr','unique_ptr'或任何其他管理存儲的指針)會造成災難。 – 2013-03-13 14:21:09
- 1. 數組繼承內的C++對象
- 2. Java繼承與C#繼承
- 3. TableView繼承multipe數組
- 4. 繼承類的數組
- 5. 繼承和指針數組
- 6. 繼承類到數組
- 7. 數組對象和繼承
- 8. UML組繼承
- 9. 在C++中繼承函數
- 10. 函數調用繼承C++
- 11. C++繼承虛函數
- 12. C++繼承函數覆蓋
- 13. C++類繼承:函數
- 14. C++繼承虛函數
- 15. C中的數據繼承#
- 16. C#繼承構造函數
- 17. C#多繼承
- 18. (un)繼承C#
- 19. C++鏈繼承
- 20. C#TabPage繼承
- 21. 繼承與C#
- 22. C#ASP.NET繼承
- 23. C++繼承
- 24. C++繼承-QList
- 25. C#繼承
- 26. 在繼承C++
- 27. C++多繼承
- 28. C++繼承「toString」
- 29. 繼承和C++
- 30. C#類繼承
導演是演員? – 2013-03-13 13:12:26
我知道每個演員都想指導,我也不知道它也是以另一種方式去做的。 – Barmar 2013-03-13 13:13:11
我知道這不是你的問題,但你的繼承層次聽起來有點可疑。可能值得考慮一個不同的結構。例如,您可以嘗試:MovieMaker是一個具體的類;角色是抽象的;導演和演員繼承角色,每個MovieMaker *具有*數量的角色。這稍微複雜一些,但會更靈活,避免不採取行動的董事出現怪異現象。 – Weeble 2013-03-13 13:20:47