Когда я создаю указатель Animal
для хранения объекта Duck
и использую метод make_choice
, который возвращает enum
, создается впечатление, что вместо этого используется метод, принадлежащий базовому классу Animal
производного Duck
класса. Как вместо этого сохранить использование метода производных классов?
#include <iostream>
#include <vector>
#include <memory>
using namespace std;
enum Choice{None, Egg, Bone};
class Animal {
protected:
std::string noise = "None";
public:
Animal() = default;
virtual ~Animal() = default;
virtual std::string getNoise() {
return noise;
}
virtual Choice make_choice(){
return None;
}
};
class Duck : public Animal {
public:
Duck() {
noise = "Quack!";
}
Choice make_choice() override {
return Egg;
}
};
int main() {
Duck duck;
cout << duck.make_choice() << endl; // should be 1 for Egg
std::shared_ptr<Animal> duckPtr = std::make_shared<Animal>(duck);
cout << duckPtr->make_choice() << endl; // also should be 1 for Egg, but is 0 for None
return 0;
};
Вывод:
1 // for Egg
0 // for None