2014-01-09 55 views
0

我想玩對象的矢量。假設我有一個Base類和兩個派生類:Derived_ADerived_B對象矢量的某些元素的類型轉換

class Base{...}; 
class Derived_A: public Base{}; 
class Derived_B: public Base{}; 

main()創建Derived_A類例如10個物體的向量:

std::vector <Derived_A> array; 
array.reserve(10); 

現在,我想要做什麼,從這個向量的元素,挑一(或幾個)並將其類型更改爲Derived_B。最後,我會有一個類Derived_A的某些元素的向量,以及一些類Derived_B

這可能嗎?或者你有更好的方法來做到這一點?

+0

你爲什麼要這麼做? 'Derived_A'和'Derived_B'不應該彼此流轉。 – Shoe

+0

您不能在Derived_A的向量中放入Derived_B。你應該讓它成爲'Base'的一個矢量,然後它可以容納任何派生類。 – Barmar

+0

@Barmar:不,一個「Base」矢量只能容納'Base'。也許你的意思是'Base *'的向量(或者一個智能指針,如果你想讓矢量管理對象的生存期)可以保存指向任何派生類的指針。 –

回答

3

不,這沒有任何實際意義。 Derived_ADerived_B不兼容;每個只有Base的一部分。

如果您有std::vector<Base*>virtual成員函數,那麼您可以[間接]存儲任一類型的對象,但不要將一個對象轉換爲另一個類型的對象。

順便提一句,向量不是數組,並且std::vector::reserve不會創建元素。它只爲它們保留了內存空間。你可能意思是std::vector::resize

+1

是的,你是對的。我今天早上在車裏想着那件事。我需要多態,爲此,我需要使用指向基類的指針向量。 –

1

您將需要幾件事情是真實的,我會想:

  1. 它必須是實際可行的Derived_A轉換爲Derived_B,而對於「兄弟」類,這將是非常不尋常。
  2. 您將不得不使用Base而不是Derived之一來存儲,即使如此,您也無法存儲對象,只能使用指針/引用。
  3. 轉換(可能)不會在原地發生,因此您可能需要刪除/重新插入。
1

std::vector <Derived_A> array; 

array.reserve(10); 

不定義10個對象的矢量。它定義了一個0對象的向量。

至於你的問題,那麼在一般情況下,Derived_A類型的對象可能不會被轉換爲Derived_b類型的對象。在這種情況下,通常的方法是定義一個指向基類的指針向量。例如,

std::vector<Base *> v; 

並向其添加指向Derived_A和Derived_B對象的指針。派生類應該繼承基類的虛函數。析構函數也必須聲明爲虛擬的。

+0

很確定我已經說過了! –

+0

@光在軌道上的比賽,我很抱歉,先生。 –

+0

確定矢量的東西。當然,我需要用push_back將對象添加到矢量中。我只是想避免太多細節,因爲我關心的是派生類。我同意你的看法,我寧願使用指向基類的向量。謝謝。 –