C++:RIIT

来源:互联网 发布:淘宝卖拖鞋的店推荐 编辑:程序博客网 时间:2024/06/06 03:49

C++:RIIT

标签(空格分隔): c++
作者:陈小默


RIIT是运行时类型识别(Runtime Type Identification)的简称。这是新添加到C++中的特性,因此各个厂商的机制通常不兼容——作为一个Java出身的程序猿我就想问C++存在的意义是什么?专门恶心程序猿的么?——因此其实现与厂商心情有关。

RIIT原理


RIIT的目的是个指针类型转换提供一个安全机制,其中最主要的关键字(迟早牛津词典随便翻一页都是C++的关键字)

  • dynamic_cast:(C++关键字)用来将一个指向基类的指针转换为指向派生类的指针
  • typeid:(<typeinfo>中定义的运算符)返回一个指出对象类型的值
  • type_info:(<typeinfo>)该结构存储了有关特定类型的信息

注意:RIIT只能适用于包含虚函数的类

dynamic_cast

当我们将一个指针赋值给同类型的指针变量,这种转换方式是可行并且安全的。我们把一个指向派生类的指针赋值给基类指针变量,这种转换方式同样是可行并且安全的。但是假如我们要把指向基类的指针赋值给派生类指针变量,这种转换方式虽然可行,但是并不安全。因此,为了处理安全问题,C++标准委员会(一个并没有什么卵用的组织)提供了dynamic_cast关键字。
其语法规则如下:

Type * p = dynamic_cast<Type *>(pt);

如果类型安全,我们将得到一个Type类型的指针p,否则结果为0(NULL,nullptr,false)C++的尿性
所以在程序中通常的做法是

Type *pt;if(p = dynamic_cast<Base *>(pb))    pt->show();

注意:即使编译器支持RIIT,在默认情况下可能并未开启,所以可能会导致编译成功运行失败(所以说C++标准委员会是一个并没有什么卵用的组织,跟联合国一样)

typeid

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

  • 类名
  • 对象

常用如下形式判断对象是否属于某一个类

if(typeid(Base) == typeid(*pb))    pb.show();

当传入的对象为null时抛出bad_typeid异常

type_info

type_info类的实现随厂商而异,但包含一个name()成员,该函数通常返回类名。

cout<<typeid(*pg).name()<<endl;
0 0
原创粉丝点击