c ++使用重载函数打印出对象数组

时间:2018-12-10 06:01:12

标签: c++ inheritance

我有一个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;
}

2 个答案:

答案 0 :(得分:4)

您不是重载 talk函数(即,为不同的方法提供不同的参数列表),而是覆盖。为了允许它被多态调用,应将其声明为virtual。例如:

virtual void talk() {
    cout<< "\nAnimal can't talk!" << endl;
}

答案 1 :(得分:3)

given answer中存在一些未解决的问题:
-您正在将CowPigSnake对象分配给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