在基本 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";}
应该可以解决问题。
我目前对涉及继承和派生对象数组的概念有疑问。我创建了一个指针数组,并根据数组位置是偶数还是奇数,用基数 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";}
应该可以解决问题。