c++ - 将子类实例保存在父类型变量中并通过父变量使用子函数?
问题描述
我有两个班级,分别是 Bird 和 Eagle。鹰是从鸟继承而来的。现在,我可以使用 Bird 类来存储 eagle 类型的实例。但是,当我尝试使用变量调用 eagle 函数时,a
我收到一条错误消息
错误:“类鸟”没有名为“攻击”的成员</p>
我如何使用函数攻击?另外,打字稿会类似吗?
#include <stdio.h>
class bird{
public:
void fly(){
printf("fly");
}
};
class eagle: public bird{
public:
void attack(){
printf("attack");
}
};
int main()
{
bird *a = new eagle();
a->attack();
return 0;
}
解决方案
该变量a
是指向类型对象的指针bird
,因此您只能调用在bird
该类上定义的方法。这是有道理的——毕竟你不能把所有的鸟都当作老鹰。
你有几个选择:
- 不要调用非
bird
方法 - 将类型更改
a
为eagle*
- 用于
dynamic_cast
解决问题(不推荐,这通常表明您对数据的建模不正确)
dynamic_cast<eagle*>(a)->attack();
文档dynamic_cast
:https ://en.cppreference.com/w/cpp/language/dynamic_cast
推荐阅读
- scala - 在 Spark 数据框中过滤多列的最佳方法是什么?
- symfony - 无法在其他环境中加载灯具
- reactjs - 在 reactjs 的每个组件中重用 useEffect 代码
- c++ - 代码在 CodeSignal 中工作不正确。不确定这是否是我的代码缺陷
- angular - 如何正确使用带有 Angular 的引导轮播
- vue.js - 在故事书中使用 vuetify vue 需要一个合适的加载器
- javascript - 计算用户位置和 geoJSON 多边形传单之间的距离
- c++ - 是否不能在 Windows 95 和 Windows NT 4.0 中运行已编译的 C++ 应用程序?
- python - 从谷歌分析 API v4 下载批处理报告
- javascript - axios 发送的请求被 Laravel 运行了两次