基类数组中重写函数的使用

Use of Overridden functions in a base class array

本文关键字:函数 重写 数组 基类      更新时间:2023-10-16

我目前遇到一个涉及继承和派生对象数组的概念问题。我创建了一个指针数组,并根据数组的位置是偶数还是奇数,用基类或派生类填充它。然而,当我调用birdType函数时,数组中的所有对象都使用基类函数,即使偶数数组对象应该使用重写的版本函数。我试图在基本函数上使用虚拟调用机制,但这似乎会使程序崩溃。

有问题的代码:

 class bird{
public:
    void birdType(){cout<<"I am a bird.n";}
};
class sparrow:public bird 
{
    void birdType() { cout <<"I am a sparrow.n";}
};
int main(){
    bird *collection[5];
    for (int i = 0; i < 5; ++i) {
        if (i % 2 != 0) 
        {
            collection[i] = new bird;
        }
        else if (i % 2 == 0)
        {
            collection[i] = new sparrow;
        }

    }
    for(int j=0;j<5;++j)collection[j]->birdType();;
}

和当前输出:

I am a bird
I am a bird
I am a bird
I am a bird
I am a bird

您需要使基类(bird)中的birdType()函数成为虚拟函数。如果它不是虚拟的,你就不会得到你想要的遗产。

virtual void birdType(){cout<<"I am a bird.n";}

应该做到这一点。