dynamic_cast运行阶段类型识别

一、dynamic_cast运算符介绍

(1)运行阶段类型识别(RTTI, Runtime Type Identification)为程序在阶段确定对象的类型,只适用于包含虚函数的类。
(2)基类指针可以指向派生类对象,想要调用派生类对象的非虚函数需要使用dynamic_cast运算符,dynamic_cast运算符用指向基类的指针来生成派生类指针;
(3)语法:

派生类指针 = dynamic_cast<派生类类型*>(基类指针);

(4)如果转换不成功,dynamic_cast返回nullptr。

注意:
(1)dynamic_cast可以将派生类指针转化为基类指针,这种做法没有任何意义;
(2)dynamic_cast可以用于引用,但是没有空指针对应引用值,如果转换请求不正确,会出现bad_cast异常;
(3)dynamic_cast只适用于包含虚函数的类。

二、例子

1、多态的例子

以下是一个正常的多态案例:

#include <iostream>
using namespace std;class Hero
{
public:Hero() {cout << "基类默认构造函数Hero()" << endl;}virtual ~Hero() {cout << "基类析构函数~Hero" << endl;}
public:virtual void skill1() { cout << "英雄释放1技能" << endl; }virtual void skill2() { cout << "英雄释放2技能" << endl; }virtual void skill3() { cout << "英雄释放大招" << endl; }
};class LLW: public Hero
{
public:LLW() {cout << "派生类默认构造函数LLW()" << endl;}~LLW(){cout << "派生类析构函数~LLW()" << endl;}
public:void skill1() { cout << "兰陵王释放1技能" << endl; }void skill2() { cout << "兰陵王释放2技能" << endl; }void skill3() { cout << "兰陵王释放大招" << endl; }
};class DW : public Hero
{
public:DW() {cout << "派生类默认构造函数DW()" << endl;}~DW() {cout << "派生类析构函数~DW()" << endl;}
public:void skill1() { cout << "典韦释放1技能" << endl; }void skill2() { cout << "典韦释放2技能" << endl; }void skill3() { cout << "典韦释放大招" << endl; }
};class HY : public Hero
{
public:HY() {cout << "派生类默认构造函数HY()" << endl;}~HY() {cout << "派生类析构函数~HY()" << endl;}
public:void skill1() { cout << "后裔释放1技能" << endl; }void skill2() { cout << "后裔释放2技能" << endl; }void skill3() { cout << "后裔释放大招" << endl; }
};int main()
{int id;cout << "请输入英雄(1-兰陵王 2-典韦 3-后裔):";cin >> id;Hero* hero = nullptr;switch (id){case 1:hero = new LLW; break;case 2:hero = new DW; break;case 3:hero = new HY; break;default:break;}if (hero != nullptr) {hero->skill1();hero->skill2();hero->skill3();}delete hero;hero = nullptr;
}

2、强转基类指针

如果想要调用派生类的非重写函数,必须转化基类指针为派生类指针:

#include <iostream>
using namespace std;class Hero
{
public:Hero() {cout << "基类默认构造函数Hero()" << endl;}virtual ~Hero() {cout << "基类析构函数~Hero" << endl;}
public:virtual void skill1() { cout << "英雄释放1技能" << endl; }virtual void skill2() { cout << "英雄释放2技能" << endl; }virtual void skill3() { cout << "英雄释放大招" << endl; }
};class LLW : public Hero
{
public:LLW() {cout << "派生类默认构造函数LLW()" << endl;}~LLW() {cout << "派生类析构函数~LLW()" << endl;}
public:void skill1() { cout << "兰陵王释放1技能" << endl; }void skill2() { cout << "兰陵王释放2技能" << endl; }void skill3() { cout << "兰陵王释放大招" << endl; }
};class DW : public Hero
{
public:DW() {cout << "派生类默认构造函数DW()" << endl;}~DW() {cout << "派生类析构函数~DW()" << endl;}
public:void skill1() { cout << "典韦释放1技能" << endl; }void skill2() { cout << "典韦释放2技能" << endl; }void skill3() { cout << "典韦释放大招" << endl; }public:void show() {cout << "典韦SHOW." << endl;}
};class HY : public Hero
{
public:HY() {cout << "派生类默认构造函数HY()" << endl;}~HY() {cout << "派生类析构函数~HY()" << endl;}
public:void skill1() { cout << "后裔释放1技能" << endl; }void skill2() { cout << "后裔释放2技能" << endl; }void skill3() { cout << "后裔释放大招" << endl; }
};int main()
{int id;cout << "请输入英雄(1-兰陵王 2-典韦 3-后裔):";cin >> id;Hero* hero = nullptr;switch (id){case 1:hero = new LLW; break;case 2:hero = new DW; break;case 3:hero = new HY; break;default:break;}if (hero != nullptr) {hero->skill1();hero->skill2();hero->skill3();if (id == 2) {DW* dw = (DW*)hero;dw->show();}}delete hero;hero = nullptr;
}

以下代码,当为典韦时,新建一个典韦指针,指向强转类型才能调用DW类的非重写函数

if (id == 2) {DW* dw = (DW*)hero;dw->show();
}

3、dynamic_cast操作符的使用

DW* dw = dynamic_cast<DW*>(hero);
if (dw != nullptr) {dw->show();
}

当指针不为nullptr的时候,则代表转换成功。

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

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

相关文章

Python入门指北二十四

Python中有哪些常用的缓存技术&#xff1f;它们的特点是什么&#xff1f; Python中有多种常用的缓存技术&#xff0c;其中最常用的是内存缓存、文件缓存和数据库缓存。 内存缓存&#xff1a;将数据存储在内存中&#xff0c;以便快速访问。这种缓存方式具有速度快、效率高的特…

【3DGS】从新视角合成到3D Gaussian Splatting

文章目录 引言&#xff1a;什么是新视角合成任务定义一般步骤NeRF的做法NeRF的三维重建NeRF的渲染 3DGS的三维重建从一组图片估计点云高斯点云模型球谐函数参数优化损失函数和协方差矩阵的优化高斯点的数量控制(Adaptive Density Control)新的问题 3DGS的渲染&#xff1a;快速可…

适用于嵌入式单片机的压缩算法

1. 简介 因为MCU的内存和算力的限制&#xff0c;那些对内存消耗大或算力需求大的压缩算法就不适合在MCU中使用。适用于MCU的压缩算法主要有&#xff1a;RLE、LZ77、Huffman、LZO、DEFLATE、LZ4。 2. 算法 2.1. RLE RLE(Run Length Encoding)&#xff0c;也称为行程编码&…

通过html2canvas和jsPDF将网页内容导出成pdf

jsPDF参考&#xff1a;https://github.com/parallax/jsPDF html2canvas参考&#xff1a;https://github.com/niklasvh/html2canvas 或者 https://html2canvas.hertzen.com 思路 使用html2canvas将选中DOM生成截图对象将截图对象借助jsPDF导出为PDF文件 代码 这是一个示例&a…

如何编写接口测试用例

作为测试人&#xff0c;我们经常要对项目中的接口进行接口测试&#xff0c;那么在做接口测试的时候&#xff0c;如何写接口测试用例呢&#xff1f; 什么是接口测试 首先我们要了解一下&#xff0c;什么是接口测试&#xff1f; 那么首先要搞清楚&#xff0c;我们一般说的接口…

LeetCode第872题 - 叶子相似的树

题目 解答 class Solution {public void inorder(TreeNode node, List<Integer> values) {if (node null) {return;}if (node.left null && node.right null) {values.add(node.val);return;}inorder(node.left, values);inorder(node.right, values);}publ…

Spring面试大全-基础知识01

1.什么是Spring Spring框架是用于构建企业级Java的开源框架&#xff0c;他通过依赖注入和IOC容器帮我我们管理对象&#xff1b;支持AOP&#xff0c;将非业务功能&#xff08;日志&#xff0c;事务等&#xff09;从我们业务代码中分离出来&#xff0c;提高了代码的可维护性&…

nginx支持wasm文件

背景 需要支持wasm文件,折腾半天不行,最后搜索wasm解决 这都是后话了,只知道是文件,不知道文件类型是wasm,关于什么事wasm直接百度 可以参考:WebAssembly(WASM) 和云原生 | wasm和区块链-CSDN博客 铺垫 Nginx通过服务器端文件的后缀名来判断这个文件属于什么类型&#xff0c…

介绍 回调函数及使用方法

回调函数是一种常见的编程概念,它允许我们将一个函数作为参数传递给另一个函数,并在需要的时候调用这个函数。回调函数通常用于异步编程、事件处理和模块间的通信。 在使用回调函数时,我们首先定义一个函数,然后将其作为参数传递给另一个函数。当满足某个条件或事件发生时…

uniapp开发一个交流社区小程序

uniapp开发一个交流社区小程序 假期的时候简单学了一下uniapp&#xff0c;想开发一款类似百度贴吧的交流社区来练练手。本篇文章主要记录开发过程&#xff0c;文末附上项目地址。 主要需要开发以下几个页面。 信息页面热榜页面用户主页用户信息页 信息页面 该页面的功能主要…

【Android】RxJava系列01-基本概述和基本用法

少年啊&#xff0c;要永远相信美好的事情即将发生 【Android】RxJava系列01-基本概述和基本用法 1.RxJava的概述2.RxJava的作用3.观察者和被观察者4.背压5.RxJava的基本用法步骤一&#xff0c;创建Observer&#xff08;观察者&#xff09;步骤二&#xff0c;创建Observable&…

华为nova12系列:图片HDR显示,让你的照片全面升级!

你是不是也想给自己的照片加点料&#xff0c;让它们看起来更真实、捕捉到更多的细节和光影&#xff1f;不用愁&#xff0c;华为nova12系列就为你量身打造了图片HDR显示技术&#xff0c;让你的照片从此焕发绚丽光芒&#xff01; 回忆一下&#xff0c;在节日的夜晚想拍下绚丽的灯…

自己动手写编译器:属性语法的实现

上一节我们研究了增强语法&#xff0c;本节我们看看何为属性语法。属性语法实则是在语法规则上附带上一些重要的解析信息&#xff0c;随着语法解析的进行&#xff0c;我们可以利用附带的解析信息去进行一系列操作&#xff0c;例如利用解析信息实现代码生成。我们先看属性语法的…

免费ai绘画软件选择哪个?

对于免费AI绘画软件的选择&#xff0c;因为每个软件都有其独特的优点和适用场景&#xff0c;可以根据个人的需求和技能水平来决定。以下是被广泛认可的AI绘画软件&#xff1a; 1、建e网AI-一款为建筑室内设计师提供AI绘图的智能工具&#xff0c;具有文字生图&#xff0c;方案优…

Python学习之路-Tornado基础:深入Tornado

Python学习之路-Tornado基础:深入Tornado Application settings 前面的学习中&#xff0c;我们在创建tornado.web.Application的对象时&#xff0c;传入了第一个参数——路由映射列表。实际上Application类的构造函数还接收很多关于tornado web应用的配置参数&#xff0c;在…

值得收藏的上千个涉及各个领域各个方面的免费的API接口服务,全网盘点并统计了网上诸多的免费API

值得收藏的上千个涉及各个领域各个方面的免费的API接口服务&#xff0c;全网盘点并统计了网上诸多的免费API。 一位开发者在GitHub上维护的免费API文档&#xff0c;不定期收录了互联网上开放的各种API接口。这些接口有些是来自第三方服务&#xff0c;你只需要在第三方注册成为会…

如何使用 FOFA 搜索引擎保姆级教程(附链接)

一、介绍 FOFA&#xff08;Fingerprinting Organizations with Advanced Tools&#xff09;是一家总部位于中国的网络安全公司提供的一款网络搜索引擎&#xff0c;专注于帮助用户收集和分析互联网上的设备和服务信息。FOFA 的主要特点包括&#xff1a; 设备指纹识别&#xff1…

面试150 颠倒二进制位 位运算分治 逻辑右移

Problem: 190. 颠倒二进制位 文章目录 思路复杂度位运算分治法 思路 &#x1f468;‍&#x1f3eb; 参考题解 >>>&#xff1a;逻辑右移&#xff08;符号位一起移动&#xff0c;高位补零&#xff09; 复杂度 时间复杂度: O ( log ⁡ n ) O(\log{n}) O(logn) 空间…

Win10系统搭建个人hMailServer邮件服务结合内网穿透远程发邮件

文章目录 前言1. 安装hMailServer2. 设置hMailServer3. 客户端安装添加账号4. 测试发送邮件5. 安装cpolar6. 创建公网地址7. 测试远程发送邮件8. 固定连接公网地址9. 测试固定远程地址发送邮件 前言 hMailServer 是一个邮件服务器,通过它我们可以搭建自己的邮件服务,通过cpola…

基于IATF思想构建网络安全治理体系

文章目录 前言一、企业网络安全现状(一)防御碎片化。(二)常见网络安全问题频发。(三)安全意识教育难度大。二、“纵深防御”式综合治理体系建设方案(一)三个核心要素(二)四个保障领域1、网络和基础设施2、区域边界3、计算环境4、支撑性基础设施总结前言 近年来,国家…