gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 04:05:21 25 4
gpt4 key购买 nike

我有一个指针数组,指向派生类对象。
代码总是调用 Base::func(),即使它在基类中是虚的,并且数组中只有派生类对象。

double Base::func2(){
...
for(unsigned i=0;i<elementNum;i++){
array[i]->func1();
...
}

带有虚函数的Base:

class Base{ 
...
public:
virtual double func1()
};

派生类:

class Derived: public Base{
...
public:
double func1(){...}
};

有一个push函数会导致这个问题:

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;
}

最佳答案

There's a push function that can cause the problem

点对点!分配给临时数组时,您正在切掉位于原始数组中的对象的派生部分(如果首先有 Derived 对象,则不会显示相关代码) :

pTemp[i]=new Base;    // creates a Base object
*pTemp[i]=*array[i]; // object slicing here, Derived part gets lost

阅读有关对象切片的更多信息 here .

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

关于C++在派生类指针数组上调用虚函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23323169/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com