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 Teacher25son

	Teacher25base * aa = dynamic_cast<Teacher25base *>(ptea);
	if (aa!=NULL) {
		cout << "aa == success" << endl; //ok
		aa->func();//注意这里:Teacher25son virtual func called
	}
	else {
		cout << "fail" << endl;
	}

	Teacher25son * bb = dynamic_cast<Teacher25son *>(ptea);
	if (bb != NULL) {
		cout << "bb = success" << endl;//ok
		bb->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 Teacher25son

	Teacher25base * aa = dynamic_cast<Teacher25base *>(ptea);
	if (aa!=NULL) {
		cout << "aa == success" << endl; //ok
		aa->func();//注意这里:Teacher25son virtual func called
	}
	else {
		cout << "fail" << endl;
	}

	Teacher25son * bb = dynamic_cast<Teacher25son *>(ptea);
	if (bb != NULL) {
		cout << "bb = success" << endl;//ok
		bb->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; // int
	cout << typeid(Teacher25base).name() << endl; //class Teacher25base
	cout << 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,是基于类的,也是在编译阶段就完成了的,

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++:第十四讲动态规划初步

每日C知识 想要在做C小游戏里实现等待效果&#xff0c;可以用Sleep。 Sleep函数可以使计算机程序&#xff08;进程&#xff0c;任务或线程&#xff09;进入休眠&#xff0c;使其在一段时间内处于非活动状态。 一般需要头文件windows.h。 注意"Sleep"首字母要大写…

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

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

LLM之Agent(十)| 本地安装Microsoft AutoGen Studio 2.0教程

2021年3月&#xff0c;微软发布了AutoGen[2]&#xff0c;这是一个使用多个代理开发LLM应用程序的框架&#xff0c;这些代理可以协作解决任务。 2024年1月&#xff0c;微软推出了一款新的应用程序&#xff0c;它名为AutoGen Studio[3]&#xff0c;可以简化AI Agent执行过程。 一…

JavaScript入门

第二个知识点&#xff1a;javascript的基本语法 定义变量 在JavaScript里面&#xff0c;没有int&#xff0c;string 之类的数据类型&#xff0c;只有 var var num 1; var string "天玄地号"; 在javascript中&#xff0c;写完一句语句之后可以不加分号&#xff…

MyBatis概述与MyBatis入门程序

MyBatis概述与MyBatis入门程序 一、MyBatis概述二、入门程序1.准备开发环境&#xff08;1&#xff09;准备数据库&#xff08;2&#xff09;创建一个maven项目 2.编写代码&#xff08;1&#xff09;打包方式和引入依赖&#xff08;2&#xff09;新建mybatis-config.xml配置⽂件…

直方图均衡化原理与代码实现

1. 简介 直方图均衡化是一种用于增强图像对比度的图像处理技术。通过调整图像的灰度级别分布&#xff0c;直方图均衡化能够使图像中的像素值更加均匀分布&#xff0c;从而增强图像的细节和对比度。 2. 原理 直方图均衡化的原理是通过调整图像的累积分布函数&#xff08;CDF&…

H2数据库学习总结

H2数据库-简介 H2 是开源的轻量级Java数据库。它可以嵌入Java应用程序中或以客户端-服务器模式运行。 H2 数据库主要可以配置为作为内存数据库运行&#xff0c;这意味着数据将不会持久存储在磁盘上。 由于具有嵌入式数据库&#xff0c;因此它不用于生产开发&#xff0c;而主要…

017 JavaDoc生成文档

什么是JavaDoc 示例 package se;/*** 用于学习Java* author Admin* version 1.0* since 1.8*/ public class Test20240119 {/*** 主方法* param args*/public static void main(String[] args) {// 你好&#xff0c;世界System.out.println("Hello world");} } 写一…

C语言实战项目<贪吃蛇>

我们这篇会使用C语言在Windows环境的控制台中模拟实现经典小游戏贪吃蛇 实现基本的功能&#xff1a; 结果如下: 1.一些Win32 API知识 本次实现呢我们会用到一些Win32 API的知识(WIN32 API也就是Microsoft Windows 32位平台的应用程序编程接口): 1)控制窗口大小 我们可以使用…

43 漏洞发现-WEB应用之漏洞探针类型利用修复

目录 已知CMS开发框架末知CMS演示案例:开发框架类源码渗透测试报告-资讯-thinkphp开发框架类源码渗透测试-咨讯-spring已知CMS非框架类渗透测试报告-工具脚本-wordpress已知CMS非框架类渗透测试报告-代码审计-qqyewu_php未知CMS非框架类渗透测试报告-人工-你我都爱的wg哦~ 已知…

Unity 自动轮播、滑动轮播

如图所示&#xff0c;可设置轮播间隔&#xff0c;可左右滑动进行轮播 1.在UGUI创建个Image&#xff0c;添加自动水平组件 2.添加并配置脚本 3.代码如下&#xff0c;都有注释 using UnityEngine; using UnityEngine.UI;public class IndicatorManager : MonoBehaviour {public …

【IM】如何保证消息可用性(二)

请先阅读第一篇&#xff1a;【IM】如何保证消息可用性&#xff08;一&#xff09; 在第一篇文章中我们了解了保证消息可用性的挑战与目标&#xff0c;现在我们来对于具体的技术方案进行探讨。 1. 上行消息 消息上行过程指的是客户端发送消息给服务端 我们需要先辨析几个概念…

mybatis代码生成器配置pojo不生成Example类,且去掉表名前缀t_

待生成的表 mybatis-generator-config.xml的table属性配置如下时生成的pojo和mapper <table tableName"%"></table>正常想要的是去掉T且去掉Example类 <table tableName"%"enableCountByExample"false" enableUpdateByExample&…

初识C语言·文件操作

目录 1 关于文件 i)文件的基本知识 ii)数据文件的分类 2 文件打开和关闭 i)流和标准流 ii)文件指针 iii)文件打开和关闭 3 文件的顺序读写 i) fgetc fputc ii) fgets fputs iii) fscanf fprintf iv) fwrite fread 4 对比一组函数 scanf/fscanf/sscanf/printf/fpri…

(十)springboot实战——springboot3下的webflux项目mysql数据库事务处理

前言 WebFlux 是 Spring Framework 5.0 中引入的一种新型反应式编程模型&#xff0c;支持非阻塞 I/O&#xff0c;适用于高并发、高吞吐量的应用程序。在 WebFlux 应用程序中使用事务需要注意以下几点。使用 Reactive R2DBC&#xff1a;WebFlux 支持使用 Reactive R2DBC 访问关…

前端大厂面试题探索编辑部——第四期

目录 题目 单选题 题解 JavaScript的异步编程 Promise 异步函数async/await 关于Ajax 题目 这期只有一道题&#xff0c;我们来详细讲讲JavaScript的异步编程&#xff0c;当然&#xff0c;异步编程是许多编程语言都有的一种编程思想&#xff0c;我们在前端这个领域&#…

Python爬虫:XPath基本语法

XPath&#xff08;XML Path Language&#xff09;是一种用于在XML文档中定位元素的语言。它使用路径表达式来选择节点或节点集&#xff0c;类似于文件系统中的路径表达式。 不啰嗦&#xff0c;讲究使用&#xff0c;直接上案例。 导入 pip3 install lxmlfrom lxml import etr…

springboot中获取配置文件中属性值的几种方式

目录 第一章、使用Value注解第二章、使用PropertySource注解第三章、使用Configurationproperties注解第四章、使用Java Properties类第五章、使用Environment接口 友情提醒: 先看文章目录&#xff0c;大致了解文章知识点结构&#xff0c;点击文章目录可直接跳转到文章指定位置…

旋转花键磨损后如何修复?

旋转花键是机械传动中的一种&#xff0c;传递机械扭矩的&#xff0c;在轴的外表有纵向的键槽&#xff0c;套在轴上的旋转件也有对应的键槽&#xff0c;可保持跟轴同步旋转。在旋转的同时&#xff0c;有的还可以在轴上作纵向滑动&#xff0c;如变速箱换档齿轮等。 我们在使用某些…

VirtualBox安装Ubuntu22.04

目录 1、新建虚拟机 1.1、设置内存大小 1.2、创建虚拟硬盘 2、虚拟机设置 2.1、设置启动顺序​编辑 2.2、选择iso镜像文件 2.3、设置网络(桥接网卡) 3、启动 3.1、设置语言环境 3.2、系统更新安装(不更新) 3.3、选择键盘布局(默认即可) 3.4、选择安装类型 3.5、网…