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

news/2025/2/15 20:31:21/

一,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.ppmy.cn/news/1338469.html

相关文章

1. 两数之和(力扣LeetCode)

文章目录 1. 两数之和题目描述哈希表&#xff1a;map二分查找暴力&#xff1a;双重for循环 1. 两数之和 题目描述 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可…

k8s Sidecar filebeat 收集容器中的trace日志和app日志

目录 一、背景 二、设计 三、具体实现 Filebeat配置 K8S SideCar yaml Logstash配置 一、背景 将容器中服务的trace日志和应用日志收集到KAFKA&#xff0c;需要注意的是 trace 日志和app 日志需要存放在同一个KAFKA两个不同的topic中。分别为APP_TOPIC和TRACE_TOPIC 二、…

GPT-SoVITS 本地搭建踩坑

GPT-SoVITS 本地搭建踩坑 前言搭建下载解压VSCode打开安装依赖包修改内容1.重新安装版本2.修改文件内容 运行总结 前言 传言GPT-SoVITS作为当前与BertVits2.3并列的TTS大模型&#xff0c;于是本地搭了一个&#xff0c;简单说一下坑。 搭建 下载 到GitHub点击此处下载 http…

【Django自学】Django入门:如何使用django开发一个web项目(非常详细)

测试机器&#xff1a;windows11 x64 python版本&#xff1a;3.11 一、安装Django 安装步骤非常简单&#xff0c;使用pip安装就行 pip install django安装完成之后&#xff0c;python的 Scripts 文件夹下&#xff0c;会多一个 django-admin.exe (管理创建django项目的工具)。…

【Docker】在Windows下使用Docker Desktop创建nginx容器并访问默认网站

欢迎来到《小5讲堂》&#xff0c;大家好&#xff0c;我是全栈小5。 这是《Docker容器》序列文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深对…

深度强化学习(王树森)笔记10

深度强化学习&#xff08;DRL&#xff09; 本文是学习笔记&#xff0c;如有侵权&#xff0c;请联系删除。本文在ChatGPT辅助下完成。 参考链接 Deep Reinforcement Learning官方链接&#xff1a;https://github.com/wangshusen/DRL 源代码链接&#xff1a;https://github.c…

springboot(ssm爱心商城系统 爱心捐赠商城系统Java系统

springboot(ssm同城上门喂遛宠物系统 宠物预约系统Java系统 开发语言&#xff1a;Java 框架&#xff1a;springboot&#xff08;可改ssm&#xff09; vue JDK版本&#xff1a;JDK1.8&#xff08;或11&#xff09; 服务器&#xff1a;tomcat 数据库&#xff1a;mysql 5.7&a…

1 月 30 日算法练习-思维和贪心

文章目录 重复字符串翻硬币乘积最大 重复字符串 思路&#xff1a;判断是否能整除&#xff0c;如果不能整除直接退出&#xff0c;能整除每次从每组对应位置中找出出现最多的字母将其他值修改为它&#xff0c;所有修改次数即为答案。 #include<iostream> using namespace …