C++ 的 RTTI
1.定义:Run-Time Type Information(运行时类型检测),是指程序能够使用基类的指针或引用来检查这些指针或引用所指的对象的实际派生类型。
2.C++ RTTI中提供了两种常用的类型:
typeid:返回指针或引用所指对象的实际类型
dynamic_cast: 将基类类型的指针或引用安全地转换为派生类型的指针和引用
3.以上两种类型的使用,必须依赖虚函数表
4.下面通过一个例子说明:
给出基类和派生类:
1 class A 2 { 3 public: 4 int num; 5 static int data; 6 virtual void run() 7 { 8 std::cout << "A run \n"; 9 } 10 }; 11 int A::data = 1; 12 class B :public A 13 { 14 public : 15 int num = 0; 16 static int data; 17 void run() 18 { 19 std::cout << "B run\n"; 20 } 21 void test() 22 { 23 std::cout << num << "\n"; 24 std::cout << "B test\n"; 25 } 26 }; 27 int B::data = 2;
测试一:(typeid)
1 void main() 2 { 3 A a1; 4 B b1; 5 A *p1 = &a1; 6 A *p2 = &b1; 7 //typeid:返回指针或引用所指对象的实际类型 8 std::cout << typeid(p1).name() << " " << typeid(p2).name() << std::endl; 9 std::cout << (typeid(p1) == typeid(p2)) << "\n"; 10 11 std::cout << typeid(*p1).name() << " " << typeid(*p2).name() << std::endl; 12 std::cout << (typeid(*p1) == typeid(*p2)) << "\n";//重载的方式判定类型是否一致 13 std::cin.get(); 14 }
测试二:(dynamic_cast)
1 void main3() 2 { 3 //dynamic_cast : 将基类类型的指针或引用安全地转换为派生类型的指针和引用 4 A a1; 5 B b1; 6 A *p1 = &a1; 7 A *p2 = &b1; 8 B *p3(nullptr); 9 //p3 = dynamic_cast<B*>(p2); 10 //dynamic_cast必须要有虚函数,根据虚函数表转换,不能转换 11 //转换失败为空 类的空指针可以调用不调用数据的函数 12 //转换成功就是地址 13 std::cout << p3 << "\n"; 14 p3->test(); 15 std::cin.get(); 16 }
没什么说的,直接看测试样例!
转载于:https://www.cnblogs.com/sxmcACM/p/4541472.html
C++ 的 RTTI相关推荐
- RTTI(三)相关函数1【转自大富翁】
第三部分RTTI相关函数 GetTypeData 函数 GetPropInfo 函数 FindPropInfo 函数 GetPropInfos 函数 SortPropList 函数 GetPropLi ...
- 关闭Delphi的RTTI
{$IF CompilerVersion >= 21.0} {$WEAKLINKRTTI ON} {$RTTI EXPLICIT METHODS([]) PROPERTIES([]) FIELD ...
- c++ RTTI(运行时类型识别)
通过RTTI,能够通过基类的指针或引用来检索其所指对象的实际类型.c++通过下面两个操作符提供RTTI. (1)typeid:返回指针或引用所指对象的实际类型. (2)dynamic_cast:将基类 ...
- Java RTTI运行时类型识别
RTTI(Run-Time Type Identification),通过运行时类型信息程序能够使用基类的指针或引用来检查这些指针或引用所指的对象的实际派生类型. RTTI提供了以下两个非常有用的操作 ...
- C++对象模型7——类的成员函数、反汇编虚析构函数、RTTI、多态的开销
一.类成员函数 class test { public:void myfunc(){}virtual void vfunc() {}static void sfunc() {} };void myfu ...
- C++知识点54——RTTI(运行时类型识别)
一.RTTI概述 RTTI的功能由两个运算符实现,一个是typeid,用来返回表达式的类型:另一个是dynamic_cast,作用是将基类的指针或引用安全地转为子类的指针或引用 二.typeid ty ...
- Java RTTI与反射(参照Java编程思想与新浪博客)
一.Java的RTTI RTTI(Run-Time Type Identification,通过运行时类型识别)的含义就是在运行时识别一个对象的类型,其对应的类是Class对象,每个java里面的类 ...
- rtti是什么java_RTTI
RTTI(Run-Time Type Identification),通过运行时类型信息程序能够使用基类的指针或引用来检查这些指针或引用所指的对象的实际派生类型. 中文名 运行时类型识别 外文名 Ru ...
- 「深入Java」类型信息:RTTI和反射
1.RTTI Run-Time Type Infomation 运行时类型信息 为什么需要RTTI? 越是优秀的面向对象设计,越是强调高内聚低耦合,正如依赖倒转原则所说:"无论是高层模块还是 ...
- 《C++ Primer plus》学习笔记之”RTTI”
1. 运行阶段类型识别(RTTI) RTTI是运行阶段类型识别的简称,它为程序在运行阶段确定对象的类型提供了一种标准方式.组要注意的是,他们只适用于包含虚函数的对象. RTTI主要包含三个元素:dyn ...
最新文章
- 七天学习计划_c#_[2][3][4][5]委托、事件、委托与事件的区别、泛型委托、Func\Action\predicate
- java随机生成不重复的数组_Java生成不重复的随机数组的方法
- Go语言goroutine+channel+select简介
- 数据链路层、交换机内容整合
- MS17-010(永恒之蓝)漏洞分析与复现
- django-重写登录认证(可以使用用户名或手机号登录)
- 数据处理程序的一点经验
- 为jupyter_notebook增加目录
- Cowboy 源码分析(十八)
- AngularJS中实现显示或隐藏动画效果的3种方式
- 我的第一个MPI程序:利用矩形规则计算pi
- SpringSecurity Exceptions
- 是时候该了解一波Protocol Buffers了[Java]
- 华为模拟器路由器交换机远程控制
- [Python知识图谱] 四.Python和Gephi实现中国知网合作关系知识图谱
- ipad iphone开发_如何在iPad或iPhone上使用外部GPS设备
- C# Winform鼠标样式设置方法
- 金昌搜索引擎优化网络推广_金昌网站推广,金昌网站推广平台,金昌企业网站推广-奇秀云AI智能推广系统-奇秀网...
- 巧用R语言挖掘谁是全网最受欢迎和最高产武侠作者
- Composer 基础使用
热门文章
- werkzeug local
- Pandas period_range
- hadoop hdfs 集群模板机配置
- pytorch torch.optim.Optimizer
- Citrix,微软,VMware:它们的优缺点(资料整理汇集)
- Windows server 2016 安装补丁报错 - The update is not applicable to your computer Error:0x800f0823
- 阿里云、腾讯云、华为云哪个好?迄今最全面的云服务评测报告出炉(转)
- Mysql学习总结(9)——MySql视图原理讲解与使用大全
- python输入错误提示再次输入_Python实现用户登录并且输入错误三次后锁定该用户...
- linux集群中mpi的并行计算环境简单配置,linux集群中MPI的并行计算环境简单配置...