У меня есть следующая иерархия классов: Класс Crocodile наследуется от Oviparous, который наследуется от Animal
Мне нужно хранить объекты типа Crocodile, Goose, Pelican, Bat, Whale и SeaLion внутри вектора, поэтому:
1- Я создаю глобальный вектор:
vector<Animal*> animals;
2- Добавляю в вектор объекты (Крокодил, Гусь, Пеликан, Летучая мышь, Кит, Морской лев):
animals.push_back(new Crocodile(name, code, numberofEggs));
3- я перебираю вектор, чтобы напечатать каждый объект на столе
for (size_t i = 0; i < animals.size(); ++i){
/* now the problem is here, each animal[i] is of type = "Animal", not Crocodile, or Goose, etc..
/* so when I try to do something like the line below it doesn't work because it can't find the method because that method is not on the Animal Class of course */
cout << animals[i]->GetName(); // THIS WORK
cout << animals[i]->GetNumberofEggs(); //THIS DOESN'T WORK
/* when I debug using the line below, every object on the vector is returning "P6Animal" */
cout << typeid(animals[i]).name(); // P6Animal instead of Crocodile
}
Я думаю, что это связано с этим сообщением std::vector для родительского и дочернего классов и я думаю, что проблема заключается в нарезке объектов, поэтому я попытался создать вектор следующим образом:
vector<unique_ptr<Animal>> animals;
//and adding the objects like this
animals.push_back(unique_ptr<Animal>(new Crocodile(name, code, numberofEggs)));
Но ничего ????
Любая помощь будет здорово! Благодарю вас!
GetNumberofEggs()
в вашем базовом классе. Пожалуйста, работайте над минимально воспроизводимым примером . - person Retired Ninja   schedule 25.06.2020typeid::name
не так полезен, как хотелось бы. Тип действительно является указателем наAnimal
. Рассмотрите возможность добавления виртуальной функцииname
к animal. - person user4581301   schedule 25.06.2020typeid
: ideone.com/UWwdXF. - person Retired Ninja   schedule 25.06.2020GetNumberofEggs
, это может не иметь смысла вAnimal
. - person user4581301   schedule 25.06.2020