我有一个指针数组,指向派生类对象
代码总是调用Base::func()
,即使它在基类中是虚拟的,
并且在数组中只有派生类对象。
double Base::func2(){
...
for(unsigned i=0;i<elementNum;i++){
array[i]->func1();
...
}
具有虚拟功能的基础:
class Base{
...
public:
virtual double func1()
};
派生类:
class Derived: public Base{
...
public:
double func1(){...}
};
有一个可以导致问题的推送功能:
template<typename T>
void Stack::push(T element){
Base** pTemp= new Base*[elementNum+1];
for(unsigned i=0;i<elementNum;i++){
pTemp[i]=new Base;
*pTemp[i]=*array[i];
}
pTemp[elementNum]=new Base;
*pTemp[elementNum]=element;
delete[] array;
array=pTemp;
elementNum++;
return;
}
答案 0 :(得分:2)
有一个可以导致问题的推送功能
现货!在分配给临时数组时,你正在切掉位于原始数组中的对象的派生部分(如果首先有Derived
个对象,则不显示相关代码):
pTemp[i]=new Base; // creates a Base object
*pTemp[i]=*array[i]; // object slicing here, Derived part gets lost
详细了解对象切片here。
如果您希望保留对象的动态类型,则需要复制指针。