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

本文主要是介绍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,是基于类的,也是在编译阶段就完成了的,

这篇关于91 C++对象模型探索。RTTI运行时类型识别回顾 与 存储位置介绍的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/666767

相关文章

Python实现对阿里云OSS对象存储的操作详解

《Python实现对阿里云OSS对象存储的操作详解》这篇文章主要为大家详细介绍了Python实现对阿里云OSS对象存储的操作相关知识,包括连接,上传,下载,列举等功能,感兴趣的小伙伴可以了解下... 目录一、直接使用代码二、详细使用1. 环境准备2. 初始化配置3. bucket配置创建4. 文件上传到os

Python中win32包的安装及常见用途介绍

《Python中win32包的安装及常见用途介绍》在Windows环境下,PythonWin32模块通常随Python安装包一起安装,:本文主要介绍Python中win32包的安装及常见用途的相关... 目录前言主要组件安装方法常见用途1. 操作Windows注册表2. 操作Windows服务3. 窗口操作

从入门到精通C++11 <chrono> 库特性

《从入门到精通C++11<chrono>库特性》chrono库是C++11中一个非常强大和实用的库,它为时间处理提供了丰富的功能和类型安全的接口,通过本文的介绍,我们了解了chrono库的基本概念... 目录一、引言1.1 为什么需要<chrono>库1.2<chrono>库的基本概念二、时间段(Durat

C++20管道运算符的实现示例

《C++20管道运算符的实现示例》本文简要介绍C++20管道运算符的使用与实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录标准库的管道运算符使用自己实现类似的管道运算符我们不打算介绍太多,因为它实际属于c++20最为重要的

Java中调用数据库存储过程的示例代码

《Java中调用数据库存储过程的示例代码》本文介绍Java通过JDBC调用数据库存储过程的方法,涵盖参数类型、执行步骤及数据库差异,需注意异常处理与资源管理,以优化性能并实现复杂业务逻辑,感兴趣的朋友... 目录一、存储过程概述二、Java调用存储过程的基本javascript步骤三、Java调用存储过程示

Visual Studio 2022 编译C++20代码的图文步骤

《VisualStudio2022编译C++20代码的图文步骤》在VisualStudio中启用C++20import功能,需设置语言标准为ISOC++20,开启扫描源查找模块依赖及实验性标... 默认创建Visual Studio桌面控制台项目代码包含C++20的import方法。右键项目的属性:

MySQL之InnoDB存储引擎中的索引用法及说明

《MySQL之InnoDB存储引擎中的索引用法及说明》:本文主要介绍MySQL之InnoDB存储引擎中的索引用法及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录1、背景2、准备3、正篇【1】存储用户记录的数据页【2】存储目录项记录的数据页【3】聚簇索引【4】二

MySQL之InnoDB存储页的独立表空间解读

《MySQL之InnoDB存储页的独立表空间解读》:本文主要介绍MySQL之InnoDB存储页的独立表空间,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、独立表空间【1】表空间大小【2】区【3】组【4】段【5】区的类型【6】XDES Entry区结构【

SQLite3 在嵌入式C环境中存储音频/视频文件的最优方案

《SQLite3在嵌入式C环境中存储音频/视频文件的最优方案》本文探讨了SQLite3在嵌入式C环境中存储音视频文件的优化方案,推荐采用文件路径存储结合元数据管理,兼顾效率与资源限制,小文件可使用B... 目录SQLite3 在嵌入式C环境中存储音频/视频文件的专业方案一、存储策略选择1. 直接存储 vs

c++中的set容器介绍及操作大全

《c++中的set容器介绍及操作大全》:本文主要介绍c++中的set容器介绍及操作大全,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录​​一、核心特性​​️ ​​二、基本操作​​​​1. 初始化与赋值​​​​2. 增删查操作​​​​3. 遍历方