0

私は2つの簡単なクラスを持っています。ベクトル表示結果が欲しいのですが、数値が表示されません。一方、ベクトルなしで結果を試すと、結果が表示されます。手伝って頂けますか?ありがとうございました。

#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は破棄されます。

vector<One<string>*>ポインタが格納され、問題が発生しないように a を試してください。メモリを管理するには、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 に答える