1 RTTI和类型转换运算符-德赢Vwin官网 网
0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

RTTI和类型转换运算符

冬至子 来源:iDoitnow 作者:艰默 2023-07-18 11:23 次阅读

1. RTTI

RTTI是 运行阶段类型识别 (Runtime Type Identification)的简称。该特性是为了程序在运行阶段确定对象类型提供一种标准方式。

1.1 RTTI的三个元素

由于只有包含虚函数的类层次结构,才能将派生类对象的地址赋给基类指针,因此RTTI只适用包含虚函数的类。

  • dynamic_cast运算符将使用一个指向基类的指针来生成一个指向派生类的指针,否则,该运算符返回0—空指针。
  • typeid运算符返回一个指出对象的类型的值。
  • type_info结构存储了有关特定类型的信息

1.1.1 dynamic_cast运算符

dynamic_cast运算符是RTTI中最常用的组件,其主要的功能是 确定是否可以安全地将对地址赋给特定类型的指针 ,如果可以则返回该特定类型的指针,如果不可以则返回0(空指针)。可以理解为dynamic_cast可以用来类型转换,如果可安全转换,则转换成相应的类型指针,否则直接返回0(空指针)。其语法如下:

dynamic_cast< type_name > (expression)

例如下面的例子:

class Base{
    private:
    double val;
    public:
    Base(double a = 0):val(a){}
    virtial void show(){std::cout< < "Base show!"< < std::endl();}
}

class BaseA:public: Base{
    BaseA(double a = 0):Base(a){}
    virtual void show(){std::cout < < "BaseA show!"<

假设有下面的指针:

Base* bs = new Base;
Base* ba = new BaseA;
Base* bb = new BaseB;

对于下面类型的转换:

BaseB* b1 = dynamic_cast

因此针对该例子,dynamic_cast常用的场景如下:

auto bs = new BaseX;//BaseX为Base、BaseA、BaseB中的任意一种类型,假设其具体类型只有在程序运行过程中才能确定。
BaseA* pa;
if(pa = dynamic_cast

1.1.2 typeid运算符

typeid运算符能够确定两个对象是否为同种类型,其可以接受两种参数

  • 类名;
  • 结果为对象的表达式。

其返回一个type_info对象的引用,其实方法如下:

//需要包含头文件#include< typeinfo >
A* a = new A;//A为一个类
if(typeid(A) == typeid(*a)){
    std::cout < < "a的类型为A"<

针对上例,若a是一个空指针,则typeid(*a)会引发bad_typeid异常,该异常类型是从exception类派生出来,也是在typeinfo中生声明的。

1.1.3. type_info类

type_info类主要存储了有关特定类型的信息,其中包含了一个name()成员,该成员函数主要用于调试,其需要与typeid搭配使用,使用方法如下:

//class A;
A* a = new A;
std::cout< < typeid(*a).name()<

2. 类型转换运算符

2.1 dynamic_cast

前面已经介绍过其用法,该运算符的主要用途是,使得 能够在类层次结构中进行向上转换 (即派生类到基类的转换,由于该转换是is-a的关系,所以该转换是安全的),而不允许其他的转换。

2.2 const_cast

const_cast运算符用于执行只有一种用途的类型转化,即改变constvolatile,其语法与dynamic_cast相同:

const_cast < type_name > (expression)

如果类型的其他方面也被修改,则上述类型转换将出错,也就是说除了constvolatile特征(有或无)可以不同外,type_nameexpression的类型必须相同。假设AB,则有下面的转换:

A a;
const A* pa = &a;
A* pa1 = const_cast< A* >(pa); //正确
const B* pb = const_cast< const B* >(pa);//错误

提供该运算符的原因是,程序有时候可能需要一个这样的值,它在大多数的时候是常量,而有时候又是可以修改的,在这种情况下,可以将这个值声明为const,并在需要修改它的时候,使用const_cast

2.3 static_cast

static_cast运算符与其他类型转换运算符的语法一样:

static_cast < type_name > (expression)

static_castexpression转换为type_name类型,主要用于非多态类型之间的转换,不提供运行时的检查来确保转换的安全性。主要在以下几种场合中使用:

  • 用于类层次结构中 ,基类和子类之间指针和引用的转换;当进行上行转换(把派生类的指针或引用转换成基类表示),这种转换是安全的;当进行下行转换(把基类的指针或引用转换成派生类表示),这种转换是不安全的,也需要程序员来保证;
  • 用于基本数据类型之间的转换 ,如把int转换成char,把int转换成enum等等,这种转换的安全性需要程序员来保证;
  • 把void指针转换成目标类型的指针 ,是极其不安全的,也需要程序员来保证;

2.4 reinterpret_cast

reinterpret_cast运算符与其他类型转换运算符的语法一样:

reinterpret_cast < type_name > (expression)

reinterpret_cast运算符用于天生危险的类型转换,因为其允许将任何指针类型转换为其它的指针类型。reinterpret_cast运算符并不会改变括号中运算对象的值,而是对该对象从位模式上进行重新解释 。它主要用于将一种数据类型从一种类型转换为另一种类型。

例如,它可以将一个指针转换成一个整数,也可以将一个整数转换成一个指针,然而,其并不支持所有类型的转换,例如,可以将指针类型转换为足以存储指针表示的整形,但不能将指针转换为更小的整形或浮点型。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表德赢Vwin官网 网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 转换器
    +关注

    关注

    27

    文章

    8694

    浏览量

    147080
  • 存储器
    +关注

    关注

    38

    文章

    7484

    浏览量

    163759
  • 运算符
    +关注

    关注

    0

    文章

    172

    浏览量

    11078
收藏 人收藏

    评论

    相关推荐

    C语言运算符的使用方法

    详细介绍了C语言表达式、算术运算符、赋值运算符、关系运算符、条件结构、逻辑运算符、位运算符的语法和使用方法,并讨论了
    发表于 11-02 11:30 1601次阅读
    C语言<b class='flag-5'>运算符</b>的使用方法

    C语言中基本的运算符,表达示及类型转换

    运算符用于向编译程序说明对数据操作的性质,即操作码。C 语言提供的运算符非常丰富,它们与运算量相结合可形成多种多样、使用灵活的表达式。因而为数据处理带来了极大
    发表于 11-24 16:10 212次下载

    条件运算符是什么_条件运算符有哪些

    运算符优先级高于赋值、逗号运算符,低于其他运算符。关系运算实际上是逻辑比较运算,它是逻辑运算
    发表于 11-16 16:02 1.1w次阅读
    条件<b class='flag-5'>运算符</b>是什么_条件<b class='flag-5'>运算符</b>有哪些

    单目运算符是什么_单目运算符有哪些

    单目运算符是指运算所需变量为一个的运算符,又叫一元运算符,其中有逻辑非运算符:!、按位取反运算符
    的头像 发表于 02-24 15:42 6.1w次阅读
    单目<b class='flag-5'>运算符</b>是什么_单目<b class='flag-5'>运算符</b>有哪些

    C++程序设计教程之运算符重载的详细资料说明

    ,5. 重载双目运算符,6. 重载单目运算符,7. 重载流插入运算符和流提取运算符,8. 不同类型数据间的
    发表于 03-14 16:04 4次下载
    C++程序设计教程之<b class='flag-5'>运算符</b>重载的详细资料说明

    C运算符的优先级和结合性详细解决

    运算符是一种告诉编译器执行特定的数学或逻辑操作的符号。 C语言内置了丰富的运算符,大体可分为10类:算术运算符、关系运算符、逻辑运算符、位
    的头像 发表于 02-22 17:27 3232次阅读

    浅析MySQL中的各类运算符

    MySQL支持多种运算符,我们在写SQL脚本时经常会需要用到各种各样的运算符,这些运算符可以用来连接表达式,进而从数据库中查询我们需要的结果集等。这些类型主要包括算术
    的头像 发表于 05-03 17:41 2051次阅读
    浅析MySQL中的各类<b class='flag-5'>运算符</b>

    python运算符是什么

    python运算符 0. 什么是运算符? 本章节主要说明Python的运算符。举个简单的例子 4 +5 = 9 。 例子中,4和5被称为操作数,“+”号为运算符。 Python语言支持
    的头像 发表于 02-21 16:44 2376次阅读

    C语言总结_语句、运算符

    当前文章复盘C语言的: 位运算运算符、基本运算符、数据类型、变量、for语句、while语句、goto语句、switch语句、运算符优先级强
    的头像 发表于 08-14 09:39 999次阅读

    什么是运算符重载

    重载运算符是具有特殊名称的函数,是通过关键字** operator **后跟运算符的符号来定义的
    的头像 发表于 01-20 15:30 2486次阅读

    条件(三元)运算符

    RTL建模中广泛使用的运算符是条件运算符,也称为三元运算符,该运算符用于在两个表达式之间进行选择——表5-2列出了用于表示条件运算符的重点。
    的头像 发表于 02-09 15:42 1354次阅读
    条件(三元)<b class='flag-5'>运算符</b>

    什么是移位运算符

    移位运算符将向量的位向右或向左移位指定的次数。SystemVerilog具有按位和算术移位运算符
    的头像 发表于 02-09 15:49 1826次阅读
    什么是移位<b class='flag-5'>运算符</b>

    关系运算符与表达式

    关系运算符的作用就是对来俩个数值进行比较,并且将比较结果以布尔类型返回。如果关系运算符成立,则返回值为1,布尔类型为真。相反,若关系运算符
    的头像 发表于 02-21 15:14 1064次阅读
    关系<b class='flag-5'>运算符</b>与表达式

    Go语言运算符主要包括哪些呢?

    Go语言运算符主要包括:算数运算符、关系运算符、逻辑运算符、位运算符、赋值运算符和其他
    的头像 发表于 05-26 15:54 857次阅读
    Go语言<b class='flag-5'>运算符</b>主要包括哪些呢?

    逻辑运算符两侧运算对象的数据类型

    逻辑运算符是编程中常用的运算符之一,用于判断两个表达式之间的关系,并返回布尔值结果。在逻辑运算中,两侧运算对象的数据类型可以是任意
    的头像 发表于 11-30 14:15 1754次阅读