2013-05-04 65 views
0

我有兩個簡單的類。我想用矢量顯示結果,但數字不顯示。另一方面,當我嘗試沒有向量的結果時,結果將顯示。你可以幫我嗎?謝謝。向量顯示錯誤

#include <iostream> 
#include <string> 
#include <vector> 
#include <iterator> 

using namespace std; 


template<typename T> 
class One 
{ 
protected: 
    T word; 
    T word2; 

public: 
    One() {word = "0"; word2 = "0";} 
    One(T w, T w2) {word = w; word2 = w2;} 
    virtual const void Show() {cout << word << endl; cout << word2 << endl;} 
}; 

template<typename T> 
class Two : public One<T> 
{ 
private: 
    int number; 
public: 
    Two() {number = 0;} 
    Two(T w, T w2, int n) : One(w,w2) {number = n;} 
    virtual const void Show() {cout << word << endl; cout << word2 << endl; cout << number << endl; } 
}; 


int main() 
{ 
    One<string> *idk; 
    Two<string> *something = new Two<string>("asd","aa",1); 
    idk = something; 

    idk->Show(); // OK - asd, aa, 1 

    vector<One<string>> arr; 
    arr.push_back(*idk); 
    arr.at(0).Show(); // WRONG - asd,aa 
    return 0; 
} 
+2

請參閱[C++中的切片問題?](http://stackoverflow.com/questions/274626/what-is-the-slicing-problem-in-c/274634#274634) – WhozCraig 2013-05-04 14:20:15

+0

':一個( w,w2){number = n; }'我想應該是':一個(w,w2){number = n;}' – 0x499602D2 2013-05-04 14:21:25

回答

3

你存儲One<string>實例而不是指向他們One<string>*

由於對象完全存儲在向量單元格中,因此該對象遭受slicing:沒有多態性:在放入向量內的實例中,從One繼承的任何其他功能都將被丟棄。

嘗試使用vector<One<string>*>以便存儲指針並且不會發生問題。請注意,要管理內存,在使用STL集合時使用smart pointer是明智的選擇。

0

你的矢量商店One<string>對象。當您push_back(*idk)時,將通過*idk的複製構造函數創建新的One<string>對象。

如果你想保持虛擬行爲,你應該使用指針向量:vector<One<string>*> arr;然後arr.push_back(idk);