矢量显示错误

mistake in vector showing

本文关键字:错误 显示      更新时间:2023-10-16

有两个简单的类。我想与矢量显示结果,但数字不显示。另一方面,当我尝试没有向量的结果,结果将显示。你能帮我吗?谢谢你。

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

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

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

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

您的矢量存储One<string>对象。当您执行push_back(*idk)时,将通过复制*idk的构造函数创建一个新的One<string>对象。

如果你想保持虚行为,你应该使用指针向量:vector<One<string>*> arr;arr.push_back(idk);

相关文章: