C++在派生类指针数组上调用虚拟函数

C++ Calling virtual functions on array of derived class pointers

本文关键字:调用 虚拟 函数 数组 指针 派生 C++      更新时间:2023-10-16

我有一个指针数组,指向派生类对象
代码总是调用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

在此处阅读有关对象切片的更多信息。

如果希望保留对象的动态类型,则需要复制指针。