我有一个类似于此的代码(简化以帮助提出问题)
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。
答案 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;
}