码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【C++】面向对象编程(七)RTTI(运行时的鉴定机制):typeid、static_cast、dynamic_cast


    RTTI

    Run-Time Type Identification,运行时鉴定机制。

    typeid运算符

    查询多态化的类指针/引用,来获得类指针/引用所指对象的实际类型;

    #include 
    inline const char* num_sequence::what_am_i() const {return typeid(*this).name();}
    //typeid(*this)表达式返回一个type_info对象
    //关联到what_am_i()函数中由this指针所指对象
    
    • 1
    • 2
    • 3
    • 4
    • typeid运算符会返回一个type_info对象,其中存储着与类型相关的种种信息;
    • 每个多态类(如Fibonacci、Pell等等)都对应一个type_info对象,该对象的name()函数会返回一个const char*用于表示类名:

    type_info类

    支持相等和不相等两个比较操作;

    //测试ps这个基类指针是否指向Fibonacci派生类对象
    num_sequence *ps = &fib;
    //...
    if(typeid(*ps)==typeid(Fibonacci))
    //...ok,的确指向Fibonacci派生类对象
    
    //但是
    ps->gen_elements(64);//错误
    ps->Fibonacci::gen_elems(64);//错误
    //ps不是派生类指针
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    想要用基类指针调用派生类的成员函数,必须把基类指针强制转换为派生类指针:

    static_cast运算符

    • 提供无条件转换(基类指针–派生类指针);
    • 潜在危险:编译器无法确定我们所进行的转换操作是否完全正确。(加入if(typeid( *ps ) == typeid( Fibonacci ))条件)
    if(typeid( *ps ) == typeid( Fibonacci )) //typeid运算结果为真的条件下
    {
    	Fibonacci *pf = static_cast<Fibonacci*>(*ps);
    	pf->gen_elems(64);//无条件转换
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    dynamic_cast运算符

    • 提供有条件的转换;
    • 在运行时进行检验操作,检验基类指针所指对象是否属于某派生类:
      • 如果是,转换操作便会进行,于是派生类类指针指向了派生类类对象;
      • 如果不是,dynamic_cast运算符返回0,静态调用也就不会发生。
    //dynamic_cast在运行时进行检验操作
    if(Fibonacci *pf = dynamic_cast<Fibonacci*>(ps))
    {
    	pf->gen_elems(64);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
  • 相关阅读:
    软件工程学术顶会——ESEC/FSE 2022 议题(网络安全方向)清单、摘要与总结
    基于Go/Grpc/kubernetes/Istio开发微服务的最佳实践尝试 - 1/3
    探索设计模式:观察者模式
    并发与并行,线程的创建
    程序设计入门竞赛
    GhostNet实战:使用GhostNet实现图像分类任务(一)
    投稿有礼,双社区签约博主名额等你赢!
    java基于springboot+vue的在线求助系统
    CNCF Keith Chan:分布式云时代,云原生社区的发展与趋势
    力扣:153. 寻找旋转排序数组中的最小值(Python3)
  • 原文地址:https://blog.csdn.net/weixin_49347928/article/details/133704352
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号