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;
}
4

2 回答 2

3

您正在存储One<string>实例而不是指向它们的指针One<string>*

由于对象完全存储在向量单元中,因此不存在多态性,因为对象会受到切片One的影响:从您放置在向量内的实例中继承的任何附加特征都将被丢弃。

尝试使用 avector<One<string>*>以便存储指针并且不会发生问题。请注意,为了管理内存,在使用 STL 集合时使用智能指针是一个明智的选择。

于 2013-05-04T14:20:12.380 回答
0

您的向量存储One<string>对象。当您push_back(*idk)使用.One<string>*idk

如果要保留虚拟行为,则应使用指针向量:vector<One<string>*> arr;然后arr.push_back(idk);.

于 2013-05-04T14:22:00.337 回答