运行时类型信息(为什么这段代码不起作用)

时间:2013-10-28 14:53:39

标签: c++ inheritance rtti

我有一个类似于此的代码(简化以帮助提出问题)

  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。

1 个答案:

答案 0 :(得分: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;
}