【问题标题】:C++ Calling virtual functions on array of derived class pointersC++ 在派生类指针数组上调用虚函数
【发布时间】:2014-04-27 12:04:53
【问题描述】:

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

有可能导致问题的推送功能:

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

【问题讨论】:

  • 信息不足。请,我们需要一个简短的可编译示例来重现您的问题 (SSCCE)。
  • 你似乎有两个double Base::func() 的实现。
  • 看起来您对Base::func() 有两个定义——一个在课堂内,另一个在课堂外?我建议您发布更多上下文和/或显示问题的小型工作示例,因为这肯定是不正确的。
  • @Soren 我想这只是一个错字。编译器会为此发出错误。
  • 对不起,这个论坛的新手,有2个不同的功能

标签: c++ arrays function pointers virtual


【解决方案1】:

有一个推送功能会导致问题

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

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

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

如果你想保留对象的动态类型,你需要复制指针。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-08
    • 2012-08-08
    • 1970-01-01
    • 1970-01-01
    • 2018-10-21
    • 2013-08-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多