c ++ распечатать массив объектов с перегруженной функцией - PullRequest
0 голосов
/ 10 декабря 2018

У меня есть класс 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 голосов
/ 10 декабря 2018

Здесь есть несколько проблем, не рассмотренных в данном ответе :
- Вы присваиваете объекты Cow, Pig и Snake массиву Animalобъекты.Это может вызвать обрезку объектов .
- Даже если функция 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();
}

См. Демо здесь .

0 голосов
/ 10 декабря 2018

Вы не перегружаете функцию talk (т. Е. Предоставляете разные методы с разными списками аргументов), но переопределяете ее.Для того, чтобы сделать так, чтобы он вызывался полиморфно, вы должны объявить его как virtual.Например:

virtual void talk() {
    cout<< "\nAnimal can't talk!" << endl;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...