【问题标题】:Calling a derived function from an array of the base class [duplicate]从基类的数组中调用派生函数[重复]
【发布时间】:2024-01-23 13:30:01
【问题描述】:

如何从基类的数组中调用派生函数?

例如:

#include <iostream>
#include <string>

class a{

public:
    virtual void prnt(){
        std::cout<<"a"<<std::endl;
    }
};

class b: public a{

public:
    virtual void prnt(){
        std::cout<<"B"<<std::endl;
    }
};

int main()
{
    a array[3];
    array[0] = a();
    array[1] = b();
    array[2] = a();

    array[1].prnt();
}

这个例子的输出是a

有没有办法解决这个问题?

【问题讨论】:

  • 有没有办法解决这个问题。如何解决?
  • b 不是此代码的可能输出。你是说a 吗?
  • 是的。 A是我的意思。抱歉,来晚了。
  • 不能,因为它是基类的数组,也就是说里面的对象是基类的,不是派生类的,所以不能在上面调用派生类函数,因为它不是派生类。

标签: c++ arrays virtual derived


【解决方案1】:

正如贾斯汀所说,您正在目睹object slicing 的案例。获得预期行为的一种方法是使用指针:

int main() {
    a* array[3];
    array[0] = new a();
    array[1] = new b();
    array[2] = new a();

    array[1]->prnt();

    // Don't forget to delete them!
    for (int i = 0; i < 3; ++i) {
        delete array[i];
    }
}

【讨论】:

    【解决方案2】:
     array[1] = b();
    

    以上是对象切片。阅读一下here

    多态性仅适用于指针和引用。

     a *array[3];
     array[0] = new a();
     array[1] = new b();
     array[2] = new a();
    
     array[1]->print() 
    

    【讨论】: