ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

RTTI和对象转型

2021-01-14 22:03:00  阅读:263  来源: 互联网

标签:const 对象 型式 转型 cast RTTI 指针


这是我学习基于Linux C++做的笔记!

运行期型式信息RTTI

RTTI

  • 运行期间表示对象的型式信息
  • 优势:允许使用指向基类的指针或引用自如地操纵派生类对象
  • typeid:获取表达式的类型;type_info:型式信息类;
  • 头文件:“typeinfo”

对象转型模板

dynamic_cast:动态转型(类类型指针或引用的转型)

static_cast:静态转型

reinterpret_cast:复诠转型

const_cast:常亮转型

type_info类

  1. 编译器实现的动态形式信息类型;
  2. 用于在程序运行时保存数据对象的形式信息;
  3. 不能直接使用该类,只能通过typeid操作符;
  4. 调用成员函数name(),可以获得类的名称;

typeid操作符

#include<typeinfo>
Programmer p;//类
Employee &e=p;//类
cout<<typeid(e).name()<<endl;//输出p实际类名的字符串 “Programmer”

dynamic_cast三种方式

  • 向上转型
  • 向下转型
  • 交叉转型:沿着类多重继承层次横向转型

指针的动态转型

  • 正确执行:指向目标类对象
  • 错误:结果为0/NULL(C++11:nullptr)

引用的动态转型

  • 正确执行:目标类对象的引用
  • 错误:引发bad_cast异常

static_cast

  • 与dynamic_cast不同,static_cast不仅可以用于指针和引用,还可用于其他类型
  • 一般用于非类型式的普通数据对象转型

static_cast的问题

  • 不进行运行期型式检查,不安全
  • 若转型失败结果未定义

const_cast

  • 用于取消和设置量的const状态

const_cast的问题

class ConstCastTest{
public:
    void PrintNum() const;
private:
    int _num;
}

void ConstCastTest::PrintNum() const{//传进来常量指针this,指向当前类对象
    //临时将指向常量对象指针转换为非常量
    const_cast<ConstCastTest*>(this)->num--;
    cout<<_num<<endl;
}

reinterpret_cast

  • 将任意型式的数据对象转型为目标型式
  • 可用于int与指针型的互换

reinterpret_cast的问题

  • 由程序员保证正确性
  • 64位系统和32位系统,之间的转型可能会出错

标签:const,对象,型式,转型,cast,RTTI,指针
来源: https://blog.csdn.net/weixin_40407112/article/details/112641276

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有