2016-05-31 2 views
0

Я пытаюсь заполнить вектор производными классами животных (Dog, Cat и т. Д.). Когда я вынимаю содержимое вектора, я хочу опустить их обратно к производным классам.Полиморфизм C++: повышение/перетаскивание и контейнеры базового класса, отсутствующие данные

После выполнения dog.setLegs (4), я возвращаю правильное количество ног с помощью getLegs(). Однако, возвращая объект Animal из вектора животных и отбрасывая его обратно на тип 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; 
} 
+0

Почему не ваш базовый класс абстрактным? –

ответ

1

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

То, что вы хотите сделать, это магазин указатели на Animal-х вместо:

std::vector<Animal *> animals; 

Так соответствующий кусок кода становится:

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

Теперь это работает для меня. Благодаря! – mathmonkey

Смежные вопросы