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

相关文章

C++ Primer 标准库vector示例详解

《C++Primer标准库vector示例详解》该文章主要介绍了C++标准库中的vector类型,包括其定义、初始化、成员函数以及常见操作,文章详细解释了如何使用vector来存储和操作对象集合,... 目录3.3标准库Vector定义和初始化vector对象通列表初始化vector对象创建指定数量的元素值

使用Python开发一个图像标注与OCR识别工具

《使用Python开发一个图像标注与OCR识别工具》:本文主要介绍一个使用Python开发的工具,允许用户在图像上进行矩形标注,使用OCR对标注区域进行文本识别,并将结果保存为Excel文件,感兴... 目录项目简介1. 图像加载与显示2. 矩形标注3. OCR识别4. 标注的保存与加载5. 裁剪与重置图像

SpringBoot实现导出复杂对象到Excel文件

《SpringBoot实现导出复杂对象到Excel文件》这篇文章主要为大家详细介绍了如何使用Hutool和EasyExcel两种方式来实现在SpringBoot项目中导出复杂对象到Excel文件,需要... 在Spring Boot项目中导出复杂对象到Excel文件,可以利用Hutool或EasyExcel

Golang基于内存的键值存储缓存库go-cache

《Golang基于内存的键值存储缓存库go-cache》go-cache是一个内存中的key:valuestore/cache库,适用于单机应用程序,本文主要介绍了Golang基于内存的键值存储缓存库... 目录文档安装方法示例1示例2使用注意点优点缺点go-cache 和 Redis 缓存对比1)功能特性

Springboot控制反转与Bean对象的方法

《Springboot控制反转与Bean对象的方法》文章介绍了SpringBoot中的控制反转(IoC)概念,描述了IoC容器如何管理Bean的生命周期和依赖关系,它详细讲解了Bean的注册过程,包括... 目录1 控制反转1.1 什么是控制反转1.2 SpringBoot中的控制反转2 Ioc容器对Bea

解读docker运行时-itd参数是什么意思

《解读docker运行时-itd参数是什么意思》在Docker中,-itd参数组合用于在后台运行一个交互式容器,同时保持标准输入和分配伪终端,这种方式适合需要在后台运行容器并保持交互能力的场景... 目录docker运行时-itd参数是什么意思1. -i(或 --interactive)2. -t(或 --

C#集成DeepSeek模型实现AI私有化的流程步骤(本地部署与API调用教程)

《C#集成DeepSeek模型实现AI私有化的流程步骤(本地部署与API调用教程)》本文主要介绍了C#集成DeepSeek模型实现AI私有化的方法,包括搭建基础环境,如安装Ollama和下载DeepS... 目录前言搭建基础环境1、安装 Ollama2、下载 DeepSeek R1 模型客户端 ChatBo

C++实现回文串判断的两种高效方法

《C++实现回文串判断的两种高效方法》文章介绍了两种判断回文串的方法:解法一通过创建新字符串来处理,解法二在原字符串上直接筛选判断,两种方法都使用了双指针法,文中通过代码示例讲解的非常详细,需要的朋友... 目录一、问题描述示例二、解法一:将字母数字连接到新的 string思路代码实现代码解释复杂度分析三、

Java对象和JSON字符串之间的转换方法(全网最清晰)

《Java对象和JSON字符串之间的转换方法(全网最清晰)》:本文主要介绍如何在Java中使用Jackson库将对象转换为JSON字符串,并提供了一个简单的工具类示例,该工具类支持基本的转换功能,... 目录前言1. 引入 Jackson 依赖2. 创建 jsON 工具类3. 使用示例转换 Java 对象为

pycharm远程连接服务器运行pytorch的过程详解

《pycharm远程连接服务器运行pytorch的过程详解》:本文主要介绍在Linux环境下使用Anaconda管理不同版本的Python环境,并通过PyCharm远程连接服务器来运行PyTorc... 目录linux部署pytorch背景介绍Anaconda安装Linux安装pytorch虚拟环境安装cu