0

これに似たコードがあります(問題を提示するために簡略化されています)

  class a
  {
   protected:
      int m_x;
  public: 
      a(int x):m_x(x){};
      ~a(){};
      virtual int GetX()=0;
  }

  class b:public a
  {
   public: 
   b(int x):a:(x){};
    ~b(){};
      virtual int GetX(){return m_x+2;};
  }
  class c:public a
  {
   public: 
   c(int x):a:(x){};
    ~c(){};
      virtual int GetX(){return m_x+4;};
  }

私はこれらの機能も持っています:

vector<a> GetData()
{
     vector<a> data;
     data.push_back(b(1));
     data.push_back(c(1));
 }

 void printData()
 { 
      vector<a> data=GetData();
      for(int I=0;i<data.size();I++)
      {
             cout<< data[I].GetX()<<endl;
      }
 }

上記のプログラムは、仮想関数を持つクラスをインスタンス化できないというエラーでコンパイルされませんでした。

だから私はこれに変更しました:

class a
  {
   protected:
      int m_x;
  public: 
      a(int x):m_x(x){};
      ~a(){};
      virtual int GetX()={return m_x};
  }

しかし、タイプ b と c のオブジェクトを作成したので、思ったように正しい結果が得られません。GetX を呼び出すと、a ではなくそれらの関数を呼び出す必要があります。だから私はこのデータを取得しています:

1
1

それ以外の

 3
 5

この問題を解決するにはどうすればよいですか?

これを機能させるためにオンにする必要があるコンパイラのスイッチはありますか?

Visual Studio 2012 を使用しています。

4

1 に答える 1

1

ポインターのベクトルを使用する必要があります。幸いなことに、VS2012 を使用しているため、最新のスマート ポインターがあります (その他の C++11 の優れた機能も備えています)。

typedef std::vector<std::unique_ptr<a>> DataVector;

DataVector GetData() {
    DataVector data;
    data.push_back(std::unique_ptr<b>(new b(1)));
    data.push_back(std::unique_ptr<c>(new c(1)));
    return data;
}

void PrintData() { 
    for(const auto & datum : GetData())
        std::cout << datum->GetX() << std::endl;
}
于 2013-10-28T15:12:20.177 に答える