当前位置: 首页 > news >正文

C++——C++中的类型识别

1.在面向对象中可能出现下面的情况

(1)基类指针指向子类对象

(2)基类引用成为子类对象的别名

静态类型——变量(对象)自身的类型

动态类型——指针(引用)所指向对象的实际类型

基类指针是否可以强制类型转换为子类指针取决于动态类型,若指针指向子类就可以转换,指向父类就无法转换,所以C++中如何得到动态类型

解决方案:利用多态

  • 在基类中定义虚函数返回具体的类型信息
  • 所有的派生类都必须实现类型相关的虚函数
  • 每个类中的类型虚函数都需要不同的实现
#include<iostream> #include<string> using namespace std; class Base { public: virtual string type() { return "Base"; } }; class Derived :public Base { public: string type() { return "Derived"; } void print() { cout << "Derived" << endl; } }; class Child :public Base { public: string type() { return "Child"; } }; void test(Base* b) { // Derived* d = static_cast<Derived*>(b); 危险的转换方式 cout << b->type() << endl; if (b->type() == "Derived") { Derived* d = static_cast<Derived*>(b); d->print(); } cout << dynamic_cast<Derived*>(b) << endl; //dynamic_cast只能显示转换是否成功,但是无法知道转换后的结果 } int main() { Base b; Derived d; Child c; test(&b); test(&d); test(&c); }

运行结果:

Base
0000000000000000
Derived
Derived
00000014E231F698
Child
0000000000000000

但是上述方式的缺陷

  • 必须从基类开始提供类型虚函数
  • 所有的派生类都必须重写类型虚函数
  • 每个派生类的类型名必须唯一

C++提供了typeid关键字用于获取类型信息

  • typeid关键字返回对应参数的类型信息
  • typeid返回一个type_info类对象
  • 当typeid的参数为NULL时将抛出异常

注意事项

  • 当参数为类型时:返回静态类型信息
  • 当参数为变量时:不存在虚函数表——返回静态类型信息;存在虚函数表——返回动态类型信息
#include<iostream> #include<string> #include<typeinfo> using namespace std; class Base { public: }; class Derived :public Base { public: void printf() { cout << "Derived" << endl; } }; void test(Base* b) { const type_info& tb = typeid(*b); cout << tb.name() << endl; } int main() { int i = 0; const type_info& tiv = typeid(i); const type_info& tii = typeid(int); cout << (tiv == tii) << endl; //1 Base b; Derived d; test(&b); //class Base test(&d); //class Base return 0; }

由于b指针所指向的对象没有虚函数表,所有返回静态类型信息

#include<iostream> #include<string> #include<typeinfo> using namespace std; class Base { public: virtual ~Base() { } }; class Derived :public Base { public: void printf() { cout << "Derived" << endl; } }; void test(Base* b) { const type_info& tb = typeid(*b); cout << tb.name() << endl; } int main() { int i = 0; const type_info& tiv = typeid(i); const type_info& tii = typeid(int); cout << (tiv == tii) << endl; //1 Base b; Derived d; test(&b); //class Base test(&d); //class Derived return 0; }

存在虚函数表——返回动态类型信息

http://www.jsqmd.com/news/502176/

相关文章:

  • 2026最接近官方的雅思机考软件推荐:界面最还原能模拟真实机考 - 品牌2026
  • 西恩士 高端制造清洁度检测 汽车零部件设备实力厂家 - 仪器权威论
  • unity如何通过反射调用Editor里的代码
  • 西恩士 优选零件表面清洁度检测仪品牌 技术创新引领精密检测 - 技术权威说
  • Claude HUD:开发者的智能开发驾驶舱
  • 北京离婚法律实务解析:专业律所如何协助化解家事纠纷 - 品牌2026
  • 西恩士 自研核心技术 汽车零部件清洁度检测设备标杆厂家 - 仪器权威论
  • 幻境·流金在影视分镜中的应用:赛博朋克风格瞬时生成与意合还原
  • Cogito-v1-preview-llama-3B效果展示:中文法律条文解释+类案推荐生成
  • Deepagents根因分析:根因分析的AI代理
  • 西恩士 知名零件清洁度检测系统厂家 国际标准赋能高端制造品控 - 技术权威说
  • 西恩士 实力零件清洁度检测设备厂家 领跑工业清洁度检测赛道 - 技术权威说
  • 基于Git进行Qwen3模型微调代码的版本管理实践
  • 系统监控终极挑战:exelban/stats压力与负载测试全攻略
  • Apache Druid地理空间查询完全指南:空间索引与扩展模块优化
  • GTE文本向量模型快速入门:零代码实现中文情感分析与文本分类
  • 颠覆传统科研模式:AI-Researcher全流程自动化指南
  • CLAP模型在教育领域的创新应用:语言发音自动评分
  • 从零搭建8086汇编开发环境:现代IDE与DOS模拟器的实战指南
  • 2026年自动化产线气动夹爪品牌推荐,稳定耐用之选 - 品牌2025
  • 避开这些坑!Python求函数最小值时90%人会犯的5个错误(SymPy/Scipy对比指南)
  • ElasticSearch动态索引更新实战:如何在不重启服务的情况下实现零停机索引更新
  • Qwen3智能字幕对齐系统开源模型定制化训练入门指南
  • 2026年广州装修选哪家?家装工装、旧房改造与全屋定制避坑指南 - 海棠依旧大
  • 【智能革命】信使Web Builder:当AI遇见可视化,如何重塑网站开发范式
  • AI_Tutorial全景指南:50+企业技术资源库深度解析
  • Qwen3-ForcedAligner-0.6B在在线教育平台的集成案例
  • LabVIEW调用HTTPS接口保姆级教程:从CA证书获取到GET请求完整流程
  • 西恩士 专业零件清洁度检测系统品牌 硬核技术赋能工业精密检测 - 技术权威说
  • Linux查看磁盘信息