在基本 class 数组中使用重写函数

Use of Overridden functions in a base class array

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

有问题的代码:

 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

您需要将基础 class(鸟)中的 birdType() 函数设为虚拟。如果不是虚拟的,你将得不到你想要的继承。

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

应该可以解决问题。