c++ primer plus笔记(12)RTTI

RTTI的3个支持元素:

①强制类型转换:

1>dynamic_cast:在类层次结构中执行指针和引用的向上转换:

dynamic_cast<type>(expression)   //expression→type

具体地说:dynamic_cast用于在类的派生层次结构中执行向上转换(派生类→基类);

                    dynamic_cast只用于指针(*)和引用(&),而不用于普通类型;

                 dynamic_cast执行运行期间类型检查,若可以进行向上转换,返回转换结果;若不可以,当其执行指针转换则返回NULL,当其执行引用转换则抛出bad_cast异常。

2>static_cast:用于普通类型间的强制转换:

static_cast<type>(expression)   //expression→type

具体地说:static_cast用于普通类型之间的强制转换;

                    static_cast可用于所有类型;

                    static_cast不执行运行期间类型检查,因此带来的结果不一定安全。

3>const_cast:用于除去变量的const标签:

const_cast<type>(expression)   //expression→type

具体地说:const_cast用于同类型间的强制转换;

                    const_cast可用于所有类型;

                    const_cast除去变量的const标签,使得变量可以被修改。

<font color= #32CD32>//值得注意的是,const_cast虽然除去指向变量的const标签,但不改变指针的const标签:

int a = 1;
const int* const c = &a;   //不可修改指向性,并没有修改a的权限的指针c
int* const p = const_cast<int*>(a);   //不可修改指向性,但有修改a的权限的指针c

并且当指向物本身为const时,const_cast无法通过指针除去变量本身的const:

int a = 1;
const int* c = &a;
int* p = const_cast<int*>(c);   //可以除去const,p可以修改a的值
const int a = 1;
const int* c = &a;
int* p = const_cast<int*>(c);   //可以除去const,但p不可以修改a的值,因为a本身为const

const_cast可以改变指针的访问权限,不可以改变指向物本身的属性,不可以修改指针的指向性是否可变。

②类型判断:

typeid(classname)   //返回一个type_info对象

其中type_info类包含于<typeinfo>头文件中;

type_info类包含类方法.name(),返回类名称;

type_info类重载了比较运算符(==,!=)因此可以用作判断是否为同类:

typeid(classname1) == typeid(classname2) 

③类型的有关信息:类型的有关信息被储存在type_info类中。

//虽然RTTI也可以用于判断类型以选择使用哪一个(同名)方法,但它绝不应该取代virtual虚函数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值