我有一个Animal类,其中包含一些继承自Animal类的动物。我覆盖了talk()函数。我需要创建一个对象数组,然后为每个类调用talk()函数。但是,当我运行此命令时,唯一的输出消息是“动物不会说话”。它只是打印出Animal类的输出,而不是其他类的输出。
还:如果我主要写cowObj.talk();
,那么输出就是我想要的“ Moo!”。
class Animal
{
private:
int Leg;
public:
Animal(){
Leg = 4;
}
void talk(){
cout<< "\nAnimal can't talk!" << endl;
}
};
class Cow: public Animal
{
public:
using Animal::talk;
void talk(){
cout<< "\nMoooo!" << endl;
}
};
class Pig: public Animal
{
public:
using Animal::talk;
void talk(){
cout<< "\nGrunt!" << endl;
}
};
class Snake: public Animal
{
};
int main()
{
Animal arya[3];
Animal animalObj;
Cow cowObj;
Pig pigObj;
Snake snakeObj;
arya[0] = animalObj;
arya[1] = cowObj;
arya[2] = pigObj;
arya[3] = snakeObj;
for(int x= 0; x < 4; x++)
{
arya[x].talk();
}
return 0;
}
答案 0 :(得分:4)
您不是重载 talk
函数(即,为不同的方法提供不同的参数列表),而是覆盖。为了允许它被多态调用,应将其声明为virtual
。例如:
virtual void talk() {
cout<< "\nAnimal can't talk!" << endl;
}
答案 1 :(得分:3)
given answer中存在一些未解决的问题:
-您正在将Cow
,Pig
和Snake
对象分配给Animal
对象的数组。这可能会导致object slicing。
-即使talk()
类中的virtual
函数是Animal
类,它也不会执行您期望的操作,因为您不是在多态地调用它。您仍将调用动物对象的talk()
。
因此,您需要的是指向vector
对象的指针的数组(最好是Animal
)。
然后,您可以为其分配不同动物对象的地址。
Animal* arya[4];
Animal animalObj;
Cow cowObj;
Pig pigObj;
Snake snakeObj;
arya[0] = &animalObj;
arya[1] = &cowObj;
arya[2] = &pigObj;
arya[3] = &snakeObj;
然后您可以像这样调用talk()
函数,这将导致调用是多态的:
for(int x= 0; x < 4; x++)
{
arya[x]->talk();
}
请参阅示例here。