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

上面的程序由于无法实例化具有虚函数的类而没有编译。

所以我把 a 改成了这个:

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

我该如何解决这个问题?

我应该打开编译器中的任何开关以使其正常工作吗?

我正在使用视觉工作室 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 回答