2013-05-04 63 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);