Полиморфизм c++: повышение/повторное преобразование и контейнеры базового класса, отсутствующие данные

Я пытаюсь заполнить вектор производными классами животных (собака, кошка и т. д.). Когда я вынимаю содержимое вектора, я хочу вернуть его обратно в производные классы.

После выполнения dog.setLegs(4) я получаю правильное количество ног с помощью getLegs(). Однако после получения объекта Animal из вектора animals и приведения его обратно к типу Dog mydog->getLegs() возвращает мне 0 вместо 4, как я ожидал.

Я думаю, что я делаю что-то неправильно здесь, но я не уверен, что. Может ли кто-нибудь помочь мне с этим? Спасибо!!

class Animal{
};

class Dog : public Animal {
public:
  void setLegs(int newLegs){legs = newLegs;};
  int getLegs(){return legs;};
protected:
  int legs=0;
};


int main(int argc, char* argv[]){

  Dog dog;
  dog.setLegs(4);
  std::cout<<dog.getLegs()<<std::endl;

  std::vector<Animal> animals;
  animals.push_back(dog);

  Dog *mydog = (Dog*) &(animals[0]);
  std::cout<<mydog->getLegs()<<std::endl;

  return 0;
}

person mathmonkey    schedule 31.05.2016    source источник
comment
Почему ваш базовый класс не абстрактен?   -  person Kerrek SB    schedule 31.05.2016


Ответы (1)


Ваш std::vector содержит только Animal. Помещение подкласса Animal в вектор «отрезает» подкласс, оставляя только Animal в векторе. Подкласс исчез. Это не больше.

Вместо этого вы хотите сохранить указатели на Animal:

 std::vector<Animal *> animals;

Таким образом, соответствующий фрагмент вашего кода становится:

 Dog *mydog = (Dog*)animals[0];
 std::cout<<mydog->getLegs()<<std::endl;
person Sam Varshavchik    schedule 31.05.2016