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

run time type information (why this code don't work)

本文关键字:代码 不起作用 为什么 类型 信息 运行时      更新时间:2023-10-16

我有一个与此类似的代码(简化以帮助呈现问题)

  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。

您需要使用指针向量。 幸运的是,由于您使用的是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;
}