如何在成为指向基类的指针后保留对子类方法的使用?

How to retain use of a child classes method after being made a pointer to the base class?

本文关键字:保留 类方法 指针 基类      更新时间:2023-10-16

当我创建一个Animal指针来保存Duck对象并使用返回enum的方法make_choice时,看起来好像正在使用属于基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

std::make_shared<Animal>(duck);没有Duck。它通过复制duck和对象切片来制作Animal,使DuckAnimal不同。

你想要

std::shared_ptr<Animal> duckPtr = std::make_shared<Duck>(duck);

或者只是

std::shared_ptr<Animal> duckPtr = std::make_shared<Duck>();

寻址但是,如果指针稍后需要存储在动物指针数组中怎么办?从评论中,

std::shared_ptr<Animal> animals[2];
animals[0] = duckPtr;

是完全合法的。无需额外的工作。