【发布时间】:2013-10-28 14:53:38
【问题描述】:
我有一个类似的代码(简化以帮助提出问题)
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
我该如何解决这个问题?
我应该打开编译器中的任何开关以使其工作吗?
我正在使用 Visual Studio 2012。
【问题讨论】:
-
这个问题被称为“对象切片”。
-
您可能想要使用类似
std::vector< a *>的元素,其中元素指向b或c对象... -
你的基类的析构函数应该是虚拟的。
-
@LokiAstari:为什么析构函数应该是虚拟的?反正它是空白的。
标签: c++ inheritance rtti