C vector中如何存放乙個基類的不同派生類?

時間 2021-05-10 02:22:45

1樓:undefined

自己寫個類,儲存乙個塊記憶體區和其大小,也可以再加上一些必要資訊,剩下的就人腦模擬編譯器吧。

你非要這麼玩,幹毛要用C++???

2樓:

1、子類沒有定義新的Field

2、Vector元素為指標,指向類實體,大都數場景這種做法更有效率,避免了無謂的複製。

這兩種都可以

3樓:三三

首先回答問題:能,就是有點拐彎抹角,具體做法見其他答案。

然後建議:不要這麼做。多型機制挺方便的,好好利用。

最後問一下:各位寫C++首先是為了炫技還是解決實際問題?

4樓:

我真搞不懂為什麼會有這麼多的答案!

一開始就有人回答用基類指標:

1 vector>,自動管理記憶體,實現多型;

2 vector 手動管理,或者借用不管理,實現多型。

而且,不止乙個人這麼說。

C++ vector中如何存放乙個基類的不同派生類?

提問者要放物件,回答者就給放物件的辦法,絲毫不去想這種場景存在的意義:

C++ vector中如何存放乙個基類的不同派生類?

C++ vector中如何存放乙個基類的不同派生類?

C++ vector中如何存放乙個基類的不同派生類?

C++ vector中如何存放乙個基類的不同派生類?

C++ vector中如何存放乙個基類的不同派生類?

C++ vector中如何存放乙個基類的不同派生類?

5樓:book輕生

你可以試試 typeid + 指標。既能放任意型別, 又能保留原有型別資訊。

#include

#include

#include

#include

#include

using P = std::pair;

using V = std::vector;

void handle(V::iterator it) else if (it->first == std::type_index(typeid(double)))

double &value = *(double*) it->second;

std::cout << "double: " << value << std::endl;

} else

int main(int argc, char const *argv)

V v;

int i = 1;

double d = 3.14;

v.push_back(P(std::type_index(typeid(i)), &i));

v.push_back(P(std::type_index(typeid(d)), &d));

for (auto it = v.begin(); it != v.end(); ++it)

handle(it);

return 0;

6樓:

可以的親。原理上可以過載=

參見:https://

7樓:Xi Yang

既然你在使用C++,你必須以更底層的方式思考這個問題:std::vector儲存的內容,記憶體布局是連續的,而且每個物體的記憶體尺寸必須相同。

所以,如果在vector容器裡儲存物件的本體而不是指標,顯然只能存一種型別,因為不同型別的尺寸無法保證一樣。

但你依然應當可以這樣:讓它使用更大的那個型別的尺寸,並強行將內容視作是某個型別:

extern "C"

;typedef struct Daughter

;typedef struct SonOrDaughter

{ unsigned type;

unionSon as_sonDaughter as_daughtertypedef std::vector MyStorage;

C++17增加了variant容器,可以以更簡單一致的方式實現上面那坨東西。

8樓:XZiar

vector假定了每個元素的存放大小都是sizeof(T),而不同派生類的大小可能是不同的。

當然啦大小不同也可以用variant來包一包,但這個時候你存的其實是乙個新的型別,型別擦除的效果不存在了。

就算大小都相同,你也要考慮放入容器時發生的型別轉換問題,因為vector的元素型別是Father,所有傳入的元素都會被轉化/構造為Father,而對於它的派生類,這個路徑一般是Son隱式轉化為Father,然後做copy/move,實際上所有的元素都已經是事實上的Father了。

當然你也可以不用vector,自己搞乙個不做型別轉換的容器,inplace構造,但既然你都寫容器了,不碰指標是不可能了。

如果你只是不想出現Father*,那用unique_ptr不好嗎?只要你有虛析構函式。

另外吐槽一下,Daughter為什麼是Father的派生類?這麼LGBT的嗎?

9樓:瞬恆

More Effective C++最開頭有乙個就講不要這樣使用array。我想vector應該也是一樣的。

如果沒有記錯的話,乙個可能的問題是vector被清理的時候,沒有辦法正確地清理掉derived class。原因像其他答案所說的,因為derived class的大小與base class不同

10樓:

不行啊,vector內部是陣列,單元大小和陣列長度就是固定的了啊,多出的成員變數沒空間放。

而且多型不就是用dynamic cast做指標操作?

C 中如何由乙個指向派生類物件的基類指標轉殖乙個相同的派生類物件,假設派生類有拷貝建構函式?

張小飛 原來自己實現的原型者模式 手機編輯,也不知道啥效果 include stdafx.h include include include include using namespace std 父類 class Resume virtual Resume virtual Resume Clone...

倒格仔中乙個基矢為什麼對應正格仔中的一族晶面?

伴蘭之石 我也是初學,簡單來說是不是因為倒格仔基矢與晶面垂直,根據倒格矢的定義,b1與a2,a3的平面垂直,b2,b3同理,乙個平面的法線可以表示一組平行平面。 心蘭相依 其實倒格仔的引入是乙個很自然的事情,完全不需要用到傅利葉變換。主流教材 我用的胡安的書 是通過對正點陣做傅利葉變換得到的倒點陣 ...

乙個月時間學習公基,想報個線下班,中公和粉筆哪個更好?

吼吼吼 不知道題主是,在上班,還是全職備考,如果是全職備考的話,乙個月的時間學習攻擊的話,還是相對充足的中公和粉筆兩個教育機構都有各自的特色,粉筆是主打的線,上課線,下課的話,建議再考慮一下,招的話,這兩年師資力量稍微弱一點,口碑也不怎麼好,建議再考慮考慮,如果想報乙個相關的面授班的話,我身邊的親戚...