[关闭]
@cxm-2016 2016-09-10T03:11:48.000000Z 字数 972 阅读 1495

C++:RIIT

c++ no
作者:陈小默


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

RIIT原理


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

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

dynamic_cast

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

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

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

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

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

typeid

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

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

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

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

type_info

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

  1. cout<<typeid(*pg).name()<<endl;
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注