C++在派生类指针数组上调用虚拟函数
C++ Calling virtual functions on array of derived class pointers
我有一个指针数组,指向派生类对象
代码总是调用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;
}
有一个推送功能可能会导致问题
当场!当分配给临时数组时,您正在切割原始数组中对象的派生部分(如果最初有Derived
对象,则不会显示相关代码):
pTemp[i]=new Base; // creates a Base object
*pTemp[i]=*array[i]; // object slicing here, Derived part gets lost
在此处阅读有关对象切片的更多信息。
如果希望保留对象的动态类型,则需要复制指针。
相关文章:
- 是否可以使用函数指针调用虚拟析构函数?
- 为什么使用存储在虚拟方法表中的地址调用虚拟函数的函数会返回垃圾?
- 使用回调函数从构造函数调用虚拟/派生方法的替代方法?
- 使用在堆栈上创建的对象调用虚拟函数
- 如何从派生类函数中调用虚拟函数
- 从内部类的析构函数调用虚拟函数
- 使用范围解析运算符时,在构造函数中调用虚拟方法是否安全?
- 调用虚拟成员类的方法
- 为什么不调用虚拟基非默认构造函数,除非大多数派生基显式调用它们?
- 为什么在运行时调用虚拟函数时需要虚拟表
- 从C++中的虚拟析构函数调用虚拟方法
- 如何在C++中调用虚拟析构函数
- 调用虚拟函数而不通过类类型指针创建任何对象
- 通过命名成员调用虚拟与地址或引用的区别
- 从派生的指针中调用虚拟功能,而无需支付VTable价格
- 为什么我不能从铸造的字节(char)数组中调用虚拟函数
- 在基类崩溃中调用虚拟功能
- 可以通过跨二进制边界传递的对象上的接口调用虚拟函数吗?
- 调用虚拟方法的不同方法
- C++未根据需要调用虚拟方法