c++ - 在成为指向基类的指针后如何保留对子类方法的使用?
问题描述
当我创建一个Animal
指针来保存一个Duck
对象并使用一个make_choice
返回 an的方法时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
解决方案
std::make_shared<Animal>(duck);
没做Duck
。它Animal
通过复制duck
并切掉所有Duck
与Animal
.
你要
std::shared_ptr<Animal> duckPtr = std::make_shared<Duck>(duck);
要不就
std::shared_ptr<Animal> duckPtr = std::make_shared<Duck>();
寻址但是,如果稍后需要将指针存储在 Animal 指针数组中怎么办?从评论中,
std::shared_ptr<Animal> animals[2];
animals[0] = duckPtr;
是完全合法的。不需要额外的工作。
推荐阅读
- r - 在 R studio 中训练数据集
- c# - C# 在繁重工作量期间保持 UI 响应的最佳方法
- javascript - 如何使用 Javascript 在 Canvas 上绘制 SVG?
- python - 检查命令作者是否具有角色 ID 列表中的特定角色
- design-patterns - 实现工厂模式 - 移除开关
- python - 如何将 1D numpy 数组元素线转换为新的 1D numpy 数组?
- machine-learning - 预测外部测试集的最佳方法是什么?
- shell - 在 Unix 中合并两个文件以根据 Key Column 有选择地打印两个文件中的列
- python - Pandas:第一次满足条件后如何删除组的所有后续行?
- r - R或Excel:确定溶解氧的每日最大值并在数据框中获取相应的时间