91 C++对象模型探索。RTTI运行时类型识别回顾 与 存储位置介绍

一,RTTI 运行时类型识别,简单回顾

C++运行时类型识别RTTI,要求父类这种必须 至少有一个虚函数,如果父类中没有虚函数,那么得到的RTTI就不准确;

RTTI就可以在执行期间查询一个多态指针,或者多态应用的信息了

RTTI的能力 靠 typeid和dynamic_cast运算符来体现。

class Teacher25base {
public:void virtual func() {cout << "Teacher25base virtual func called" << endl;}virtual ~Teacher25base(){cout << "Teacher25base virtual 析构函数被调用" << endl;}
};class Teacher25son :public Teacher25base{public:void virtual func() {cout << "Teacher25son virtual func called" << endl;}virtual ~Teacher25son() {cout << "Teacher25son virtual 析构函数被调用" << endl;}
};void main() {Teacher25base *ptea = new Teacher25son;ptea->func();cout << "------" << endl;cout << typeid(ptea).name() << endl;//class Teacher25base *cout<<typeid(*ptea).name() << endl; //class Teacher25sonTeacher25base * aa = dynamic_cast<Teacher25base *>(ptea);if (aa!=NULL) {cout << "aa == success" << endl; //okaa->func();//注意这里:Teacher25son virtual func called}else {cout << "fail" << endl;}Teacher25son * bb = dynamic_cast<Teacher25son *>(ptea);if (bb != NULL) {cout << "bb = success" << endl;//okbb->func(); //注意这里:Teacher25son virtual func called}else {cout << "fail" << endl;}
}

二 RTTI运行原理以及常用方法,以及RTTI的保存位置

typeid 返回的是一个常量对象的引用。

这个常量对象的类型一般是type_info(类)

class Teacher25base {
public:void virtual func() {cout << "Teacher25base virtual func called" << endl;}virtual ~Teacher25base(){cout << "Teacher25base virtual 析构函数被调用" << endl;}
};class Teacher25son :public Teacher25base{public:void virtual func() {cout << "Teacher25son virtual func called" << endl;}virtual ~Teacher25son() {cout << "Teacher25son virtual 析构函数被调用" << endl;}
};void main() {Teacher25base *ptea = new Teacher25son;ptea->func();cout << "------" << endl;cout << typeid(ptea).name() << endl;//class Teacher25base *cout<<typeid(*ptea).name() << endl; //class Teacher25sonTeacher25base * aa = dynamic_cast<Teacher25base *>(ptea);if (aa!=NULL) {cout << "aa == success" << endl; //okaa->func();//注意这里:Teacher25son virtual func called}else {cout << "fail" << endl;}Teacher25son * bb = dynamic_cast<Teacher25son *>(ptea);if (bb != NULL) {cout << "bb = success" << endl;//okbb->func(); //注意这里:Teacher25son virtual func called}else {cout << "fail" << endl;}const std::type_info &tp = typeid(*ptea);if (typeid(Teacher25son).name() == typeid(*ptea).name() ){cout << "相等" << endl;}else {cout << "bu相等" << endl;}//静态用法,不属于多态类型cout << typeid(int).name() << endl; // intcout << typeid(Teacher25base).name() << endl; //class Teacher25basecout << typeid(Teacher25base).raw_name() << endl;//.?AVTeacher25base@@cout << typeid(Teacher25base *).name() << endl;//class Teacher25base *cout << typeid(Teacher25base *).raw_name() << endl;//.PAVTeacher25base@@Teacher25base *ptea5 = new Teacher25base();cout << typeid(ptea5).name() << endl;//class Teacher25base *cout << typeid(*ptea5).raw_name() << endl;//.?AVTeacher25base@@cout << "断点在这里" << endl;//当我们把基类中的虚函数 都删除后,//测试如下的代码Teacher25base *ptea6 = new Teacher25son;cout << typeid(ptea6).name() << endl;//在基类没有虚函数的情况下,这块显示为 class Teacher25base//这说明:RTTI 一定和虚函数表有关系。如果没有虚函数表,RTTI就不准确。//没有虚函数的调用,没有父类子类的继承,就没有多态。}

三 那么这个RTTI的保存位置在哪里呢?


 

四。vptr,vtbl,rtti的type_info信息 构造时机

vptr 虚函数指针,是基于类对象的,是在构造函数的时候,由编译器赋值的。

vtbl 虚函数表,是基于类的,是在编译阶段就完成了的,在代码段保存

rtti 的type_info,是基于类的,也是在编译阶段就完成了的,

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/443361.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

五大架构风格之一:数据流风格

数据流风格详细介绍 系统架构数据流风格是一种软件体系结构风格&#xff0c;它强调了系统内部不同部分之间的数据流动。这种风格侧重于描述系统中的数据处理过程&#xff0c;以及数据是如何从一个组件传递到另一个组件的。以下是系统架构数据流风格的详细介绍&#xff1a; 1 基…

中国建设银行,这年终奖噶噶高!!!!(含算法原题)

国企年终 今天刷到一个近期帖子:「中国建设银行&#xff0c;这年终奖噶噶高!!!!」 先撇去具体内容不看&#xff0c;能在自然年的 月初&#xff0c;就把去年的奖金发了的企业&#xff0c;首先值得一个点赞。 再细看内容&#xff0c;年终奖是一个 字头的 位数。 由于国企通常没…

项目:博客

1. 运行环境&#xff1a; 主机 主机名 系统 服务 192.168.223.129 Server_Web Linux Web 192.168.48.131 Server-NFS-DNS Linux NFS/DNS 2. 基础配置 配置主机名&#xff0c;静态IP地址 开启防火墙并配置 部分开启SElinux并配置 服务器之间使用同ntp.aliyun.com进行…

鸿蒙harmony--TypeScript基础语法

把青春献给身后那座辉煌的都市&#xff0c;为了这个美梦我们付出着代价 目录 一&#xff0c;基础类型 二&#xff0c;数组 三&#xff0c;any 四&#xff0c;变量的类型注释 五&#xff0c;函数 5.1 参数类型注解 5.2 返回类型注解 5.3 匿名函数 六&#xff0c;对象类型 可选属…

HarmonyOS4.0系统性深入开发31创建列表(List)

创建列表&#xff08;List&#xff09; 概述 列表是一种复杂的容器&#xff0c;当列表项达到一定数量&#xff0c;内容超过屏幕大小时&#xff0c;可以自动提供滚动功能。它适合用于呈现同类数据类型或数据类型集&#xff0c;例如图片和文本。在列表中显示数据集合是许多应用…

Unity_颜色空间GammaLinear

Unity_颜色空间Gamma&Linear Unity颜色空间的选择对于效果的影响具体有多大&#xff1f; 在ProjectSetting -> Player -> OtherSetting -> Rendering设置下的颜色空间选项卡选择颜色空间进行设置&#xff1a; 太深奥的解释一时半会看不懂&#xff0c;找见一个粗…

MemcachedRedis构建缓存服务器

目录 Memcached&Redis构建缓存服务器 一、介绍 二、memcached 1、特点 2、服务框架 3.配置安装memcached 三、redis服务 1、介绍 2、特点 3、缓存 4、安装redis 5、数据持久化 6、redis主从配置 Memcached&Redis构建缓存服务器 一、介绍 许多Web应用都将…

使用宝塔面板访问MySQL数据库

文章目录 前言一、安装访问工具二、查看数据库总结 前言 前面我们已经部署了前后端项目&#xff0c;但是却不能得到数据库的信息&#xff0c;看有谁再使用你的项目。例如员工、用户等等。本次博客进行讲解如何在宝塔面板里面访问MySQL数据库。 一、安装访问工具 1、打开软件商…

飞致云开源社区月度动态报告(2024年1月)

自2023年6月起&#xff0c;中国领先的开源软件公司FIT2CLOUD飞致云以月度为单位发布《飞致云开源社区月度动态报告》&#xff0c;旨在向广大社区用户同步飞致云旗下系列开源软件的发展情况&#xff0c;以及当月主要的产品新版本发布、社区运营成果等相关信息。 飞致云开源大屏…

MATLAB有限元应用-四边形八节点梁受力弯曲

MATLAB在处理平面有限元问题和梁弯曲问题上有很强的能力,主要体现在以下几个方面: 建模与网格划分 MATLAB内置了方便的图形界面工具(pdetoolbox等),可以快速对几何模型进行二维三维网格划分,生成有限元分析需要的网格。 求解器 MATLAB内置了多种求解偏微分方程的有限元求解器…

YoloV8改进策略:IoU改进|Iou Loss最新实践|高效涨点|完整论文翻译

摘要 涨点效果:在我自己的数据集上,mAP50 由0.986涨到了0.99,mAP50-95由0.737涨到0.753,涨点明显! 目标检测是计算机视觉的基本任务之一,旨在识别图像中的目标并定位其位置。目标检测算法可分为基于锚点和无锚点的方法。基于锚点的方法包括Faster R-CNN、YOLO系列、SS…

汽车标定技术(十七)--Bypass的前世今生

目录 1.Bypass的诞生 2.Bypass的发扬光大 2.1 基于XCP的Bypassing 2.2 基于Debug的Bypass 2.3 小结 3.Bypass的实际应用 1.Bypass的诞生 下图我相信只要用过INCA的朋友都非常熟悉。 这是远古时期(2000年左右&#xff1f;我猜)ETAS针对发动机控制参数标定设计的一种并行数据…