C++运行时类型识别RTTI和显式转换+如何根据基类指针判断指针指向的子类?

运行时类型识别RTTI和显式转换

C++用于类型转换的4个操作符:reinterpret_castconst_caststatic_castdynamic_cast

转换形式:cast_name<type>(expression)

(1) reinterpret_cast本质上依赖于机器,非常危险,避免使用。

(2) const_cast改变表达式的常量属性(添加或删除const特性)。

(3) static_cast编译器隐式执行的任何类型转换都可以有static_cast显式完成。eg:基类和派生类。

(4) dynamic_cast用于将基类的指针和或引用安全地转换成派生类的指针或引用,涉及运行时类型检查。主要用于类层次间的类型转换,对没有虚函数的类使用dynamic_cast会导致编译错误:运行时dynamic_cast的操作数必须包含多态类型。dynamic_cast运行时类型检查需要运行时类型信息,而这个信息存储在类的虚函数表中,只有定义了虚函数的类才有虚函数表,所以对没有虚函数的类使用dynamic_cast会导致编译错误。dynamic_cast转换指针类型,转换成功返回目标类型,转换失败返回nullptrdynamic_cast转换引用类型,转换成功返回目标类型,转换失败抛出bad_cast异常。

 

如何根据基类指针判断指针指向的子类?

Q:两个类B,C分别继承于A(类A中含有虚函数),如果一个A类指针指向了某个对象,如何判断具体指向的对象类型?

A:使用动态运行时类型识别dynamic_cast。如果指针指向的类型不是目标类型,则dynamic_cast转换失败,返回nullptr;转换成功则返回目标类型。

        A *pa = new X;
	if ((dynamic_cast< B* >(pa)) != nullptr)
		cout << "此类X为B" << endl;
	else 
		cout << "此类X为C" << endl;

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值