RTTI 运行时类型识别

C++运行时类型识别(RTTI) 运行时类型识别(Run-time type identification,RTTI)(也叫运行时的类型鉴定机制)是程序能够使用基类的指针或引用来检查这些指针或引用所指的对象的实际派生类型。   引入RTTI的原因    在C++中,虚函数实现了基类和子类之间的多态思想,当由基类派生出来的诺干派生类具有一样的操作时,可以在基类中声明一个虚函数,然后在各个派生类中定义自己需求的部分。在函数定义 阅读详情

运行阶段类型识别RTTI(Runtime Type Identification)


    RTTI旨在为程序在运行阶段确定对象的类型提供一种标准方式。

 

    RTTI 只适用于包含虚函数的类。

 

RTTI的工作原理

C++有3个支持RTTI的元素:
(1) 如果可能的话,dynameic_cast操作符将使用一个指向基类的指针来生成一个指向派生类的指针;否则,该操作符返回0 —— 空指针。
(2) typeid操作符返回一个指出对象的类型的值。
(3) type_info结构存储了有关特定类型的信息。

 

    只能将RTTI用于包含虚函数的类层次结构,因为只有对于这种层次结构,才应该将派生对象的地址赋给基类指针。

 

1. dynameic_cast 操作符
    该操作符不能回答“指针指向的是哪类对象”这样的问题,但能够回答“是否可以安全地将对象的地址赋给特定类型的指针”这样的问题。

 

假设有如下类层次结构:
class Grand { // has virtual methods };
class Superb: public Grand { ... };
class Magnificent: public Superb { ... };


创建下面的指针:
Grand * pg = new Grand;
Grand * ps = new Superb;
Grand * pm = new Magnificent;

 

对于下面的类型转换:
Magnificent * p1 = (Magnificent *)pm;   // #1
Magnificent * p2 = (Magnificent *)pg;   // #2
Superb * p3 = (Magnificent *)pm;        // #3

 

类型转换#2就是不安全的,因为它将基类对象的地址赋给派生类指针。因此,程序将期望基类对象有派生来的特征,而通常这是不可能的。
类型转换#3是安全的,因为公有派生确保Magnificent对象同时也是一个Superb对象(直接基类)和一个Grand对象(间接基类)。虚函数确保了类方法调用的正确性。

 

dynameic_cast操作符的用法如下,其中pg指向一个对象:

 

Superb * pm = dynameic_cast<Superb *>(pg);

 

这提出了这样的问题:指针pg的类型是否可被安全地转换为Superb *? 如果可以,操作符将返回对象的地址,否则返回一个空指针。

 

    即使编译器支持RTTI,在默认情况下,它也可能关闭该特性。如果该特性被关闭,程序可能仍能够通过编译,但将出现运行阶段错误。例如,在Microsoft Visual C++ 7.1中,选择Project/proj properties(其中proj是当前使用的工程名),切换到选项卡C/C++,然后单击Language,将Enable Run-Time Type Info设置为Yes。

 

    应尽可能使用虚函数,而只在必要时使用RTTI。

 

    将dynameic_cast用于引用时,没有与空指针对应的引用值,因此无法使用特殊的引用值来指示失败。当请求不正确时,dynameic_cast将引发类型为bad_cast的异常,该异常是从exception类派生而来的,它是在头文件typeinfo中定义的。

 

可以像下面这样使用该操作符,其中rg是对Grand对象的引用:

#include <typeinfo>   // for bad_cast
...
try {
    Superb & rs = dynameic_cast<Superb &>(rg);
    ...
}
catch(bad_cast & ex) { ... }

 

2. typeid 操作符和 type_info 类
   typeid操作符使得能够确定两个对象是否为同种类型。它与sizeof有些相像,可以接受两种参数:
(1) 类名。
(2) 结果为对象的表达式。

 

   typeid操作符返回一个对type_info对象的引用,其中,type_info是在头文件typeinfo(以前为typeinfo.h)中定义的一个类。type_info类重载了==和!=操作符,以便可以使用这些操作符来对类型进行比较。

 

例如,如果pg指向的是一个Magnificent对象,则表达式:
typeid(Magnificent) == typeid(*pg)


结果将为bool值true,否则为false。

如果pg是一个空指针,程序将引发bad_typeid异常。该异常类型是从exception类派生而来的。在头文件typeinfo中声明的。

 

    type_info类的实现随厂商而异,但包含一个name()成员,该函数返回一个字符串(内容随实现而异,但通常是类的名称)。例如:

cout <<"Now processing type " << typeid(*pg).name()<<"./n";
将显示为指针pg指向的对象所属的类定义的字符串。

RTTI(运行时类型识别) RTTI需要以继承为基础。RTTI基类中需要有虚函数或者纯虚函数。RTTI使用typeid和来实现。需要注意在基类向派生类转换时可能会失败。 阅读详情

相关推荐

拆解英飞凌CoolGaN:如何用Silvaco TCAD仿真评估功率GaN HEMT的关键性能(BV、Qg、开关损耗)

本文详细解析了如何使用Silvaco TCAD仿真工具评估英飞凌CoolGaN功率GaN HEMT的关键性能指标,包括击穿电压(BV)、栅电荷(Qg)和开关损耗。通过精确建模极化效应、优化边缘终端结构以及高频开关损耗仿真技术,为功率器件工程师提供了一套完整的'设计-仿真-验证'方法论,助力GaN HEMT在快充、数据中心电源等领域的应用。

weixin_29159995的博客 426

C++ dynamic_cast的使用

C++11中引入了一些新的类型转换操作符,我们来看看dynamic_cast的使用。 首先,让我们考虑一下:在什么场景下我们希望使用dynamic_cast呢? #include <iostream> class Base { public: virtual void print() { std::cout << "Base print" << std...

斧冰 9712

CAN:CANape使用Function处理数据

CANape中的function and script习惯称之为脚本(实际为函数和脚本)。这里介绍function,可以实现简单信号a和信号b乘法,比如计算功率(转速与扭矩乘)。该功能前期有专业人员做支援,当时问其编制方法,其回答是看帮助文件。现在没有支援自己动手。 功能描述:电压信号阶梯增加,每次保持1.5s,测量后0.5s位移平均值(假设信号步长10ms,需要取样50个点,但该脚本中点的数目为10个)。图示如下: 刚开始看了软件Function definition→Library function,

Morven 1万+

RTTI(typeid、dynamic_cast)

什么是RTTI? RTTI是 “run-time type identification”的缩写,意思是运行时类型识别,它提供了运行时确定对象类型的方法。 RTTI的功能由两个运算符实现: 1)dynamic_cast运算符,用于将基类的指针或引用安全转换成派生类的指针或引用。 2)typeid运算符,用于返回表达式类型。我们想使用基类对象的指针或引用执行某个派生类操作,并且该操作不是虚函数。

草根学僧 1007

baostock实战:如何用Python批量下载多只股票的历史数据(含常见错误排查)

本文详细介绍了如何使用Python和baostock库批量下载多只股票的历史数据。内容涵盖从环境搭建、代码标准化到构建稳健的批量下载框架的全过程,并重点提供了高级错误处理、网络重试、数据验证及内存管理等实战解决方案,帮助用户高效构建股票数据处理流水线。

nice1的博客 1081

告别编译噩梦:Vcpkg+Cmake一站式集成Tesseract-OCR C++开发环境(Windows)

本文详细介绍了如何在Windows系统上使用Vcpkg和CMake快速集成Tesseract-OCR C++开发环境,解决传统编译过程中的依赖问题。通过一键安装和自动化配置,开发者可以高效搭建OCR识别系统,支持中英文识别,并提供了常见问题的解决方案和进阶技巧。

weixin_29009339的博客 231

C++中深入理解dynamic_cast

dynamic_cast运算符的主要用途:将基类的指针或引用安全地转换成派生类的指针或引用,并用派生类的指针或引用调用非虚函数。如果是基类指针或引用调用的是虚函数无需转换就能在运行时调用派生类的虚函数。 前提条件:当我们将dynamic_cast用于某种类型的指针或引用时,只有该类型含有虚函数时,才能进行这种转换。否则,编译器会报错。 dynamic_cast运算符的调用形式如下所示: dy

sky0942的博客 1万+

XXL-Job 分布式定时任务

XXL-JOB是一款轻量级分布式定时任务调度框架,采用调度中心与执行器分离架构,解决单机任务宕机、重复执行等问题。核心模块包括调度中心(管理任务配置、触发调度)和执行器(执行任务逻辑),支持集群部署保证高可用。框架提供丰富的任务触发规则、路由策略、阻塞策略及完善的运维能力,适用于多种业务场景如数据同步、定时推送等。安装时需准备MySQL数据库并初始化表结构,通过Docker部署调度中心服务。相比其他定时框架,XXL-JOB具有轻量化、可视化等优势,是中小企业的首选方案。

郭宝的博客 697

P39-第15章友元、异常和其他-04RTTI,运行阶段类型识别和dynamic_cast

文章目录1. RTTI2. RTTl的用途3. RTTI的工作原理1. dynamic_cast运算符 1. RTTI RTTI是运行阶段类型识别( Runtime Type Identification)的简称。 这是新添加到C+中的特性之一,很多老式实现不支持。另一些实现可能包含开关RTTI的编译器设置。 RTTI旨在为程序在运行阶段确定对象的类型提供一种标准方式。很多类库已经为其类对象提供了实现这种功能的方式,但由于C++内部并不支持,因此各个厂商的机制通常互不兼容。创建一种RTTI语言标准将使得未来

梦悦foundation 346

Higress 入门:初探阿里云原生 AI 网关

Higress 是一款由阿里巴巴推出的云原生 API 网关,其内核基于 Istio 和 Envoy。与传统 API 网关不同,它深度聚焦于 AI 场景,支持国内外众多主流模型供应商,如 OpenAI、百度文心一言等,还兼容基于 vllm/ollama 等自建的 DeepSeek 模型,能够满足不同类型企业对 AI 能力集成与管理的需求。Higress 作为一款功能强大的云原生 API 网关,在 AI 时代展现出独特的优势。

加入“Super Entity”,与全能开发团队共探AI智能体与数字人项目,开启前沿技术之旅。 1862

【Arduino 动手做】构建一个迷你 Las Vegas RGB LED 球体

《Arduino迷你拉斯维加斯球体项目:15岁少年的创意挑战》 15岁的Ben通过本项目展示了如何利用Arduino平台制作一个经济实惠的迷你拉斯维加斯球体夜灯。该项目涉及LED选择(采用WS2812B可编程灯带)、电子元件配置(含Arduino Nano微控制器和红外遥控)以及3D建模设计(100毫米直径球体)。项目难点包括LED布局优化、供电方案设计和3D打印外壳制作。Ben详细记录了从背景研究、电路设计到最终实现的完整过程,特别强调了分辨率与成本的平衡,以及如何通过白色扩散器改善视觉效果。这个项目不仅

雕爷学编程 1024

类型转换操作符

四种类型转换操作符(1.dynameic_cast 、2.const_cast 、3.static_cast 、4.reinterpret_cast)

孤云出岫, 去留一无所系. 朗镜悬空,静躁两不相干. 808

基于Matlab的自动泊车系统开发:利用模糊控制实现智能停车解决方案的详细教程

Matlab是一种广泛应用于科学计算、工程建模与仿真的编程语言,其强大的工具箱和简洁的编程语法,使其成为开发自动泊车系统的理想选择。在开始编写代码之前,我们需要搭建Matlab的工作环境,并熟悉相关的工具箱,如Fuzzy Logic Toolbox,用于实现模糊控制。首先,确保你已经安装了Matlab软件,并加载了必要的工具箱。接下来,我们将逐步讲解如何在Matlab中实现自动泊车系统。

qq_38334677的博客 662

RTTI—运行时类型识别

在存在虚函数表的继承关系时,每个虚函数表前面都设置有一个type_info指针,用于支持RTTI,RTTI是为多态而生成的信息,包括对象继承关系,对象本身的描述等,只有具有虚函数的对象才会生成。

zxxkkkk的博客 325

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

RTTI运行时类型识别

RTTI(Run-Time Type Identification),通过运行时类型信息程序能够使用基类的指针或引用来检查这些指针或引用所指的对象的实际派生类型。。面向对象的编程语言,像C++,Java,delphi都提供了对RTTI的支持。 本文主要介绍C++的RTTI以及MFC相关的RTTI。 1、C++ RTTI提供了以下两个非常有用的操作符: 1)typeid操作符,返回指针和引用

baidu_27396537的博客 402

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

C++RTTI(运行时类型识别)

然而,并非任何时候都能定义一个虚函数。假设我们无法使用虚函数,则可以使用一个RTTI运算符。另一方面。

2301_80224556的博客 1361

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

java 运行时类型_Java基础之RTTI 运行时类型识别

运行时类型识别(RTTI, Run-Time Type Identification)是Java中非常有用的机制,在Java运行时,RTTI维护类的相关信息。多态(polymorphism)是基于RTTI实现的。RTTI的功能主要是由Class类实现的。Class类Class类是"类的类"(class of classes)。如果说类是对象的抽象和集合的话,那么Class类就是对类的抽象和集合。每...

weixin_39758696的博客 272

Java中运行时类型识别RTTI

在Java中,并不是所有的类型信息都能在编译阶段明确,有一些类型信息需要在运行时才能确定,这种机制被称为RTTI,英文全称为Run-Time Type Identification,即运行时类型识别,有没有一点“知行合一”的味道?运行时类型识别主要由Class类实现。 一、class 和Class 在Java中,我们常用“class”(首字母为小写的c)关键字来定义一个类,说这个类是对某一类对...

FeelTouch Labs 719

RTTI(运行时类型识别)问题

使用dynamic_cast就必须在编译器中启动RTTI,即“运行时期类型识别”。默认情况下编译器是不启动RTTI的。凡是程序中用到了RTTI(比如typeid)都要在编译器中打开RTTI,这样才能正确编译。 VC6下启动RTTI:Project->settings->c/c++->category->c++ language,将Enable Run-Time Type Infom

Jie 938

5. C++ 运行时类型识别RTTI

作为C++开发人员,基本都知道dynamic_cast是C++中几个常用的类型转换符之一,其通过类型信息(typeinfo)进行相对安全的类型转换,在转换时,会检查转换的src对象是否真的可以转换成dst类型。这块逻辑比较绕,其实可以将关系理解为图上的一条条连接线,节点理解为类型信息,dynamic_cast的过程,就是判断有没有从src到dst有没有路径的过程。否则,在编译期就能获取其具体类型,甚至在某些情况下,可以对typeid()的结果直接进行替换。然后根据返回值的内容来判断结果,并进行相应的操作。

谢谢大家的关注 799

c++ RTTI 运行时类型识别

文章摘自 C++从入门到精通(第四版)清华大学出版社运行时类型识别(Run-time Type Identification,RTTI)是在只有一个指向基类的指针或引用时所确定的一个对象的类型。在编写程序的过程中,往往只提供了一个对象的指针,但通常在使用时需要明确这个指针的确切类型。利用RTTI就可以方便的获取某个对象指针的确切类型并进行控制。RTTI可以在程序运行时通过某一对象的指针确定该对象的类型。许多程序设计人员都使用过虚基类编写面向对象的功能。通常在基类中定义了所有子类的通用属性或行为。但有些时候子

Li5566123的博客 562

C++运行时类型识别(RTTI)

C++运行时类型识别(RTTI) 运行时类型识别RTTI(即Run-Time Type Identification) 主要通过typeid和dynamic_cast来实现

鬼谷子的博客 959

C++运行时类型识别RTTI

c++ RTTI(runtime type identification)

weixin_42581560的博客 614

RTTI:运行时类型识别

RTTI:运行时类型识别参考链接:https://www.cnblogs.com/JohnTsai/p/4821287.html1、什么是RTTI应用场景2、获取Class对象的三种方法 参考链接:https://www.cnblogs.com/JohnTsai/p/4821287.html 在《Java编程思想》一书中,学习泛型的时候提到了一个很重要的点,称之为RTTI,即运行时类型识别 经过自...

Justmemoryl 338
上一篇: 嵌套类(嵌套类、结构和枚举的作用域特征——图)
下一篇: 类型转换操作符
TypeCool
博客等级 码龄22年 58粉丝 93原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值