?[C++_10]RTTI

15 RTTI(运行时类型识别)

程序能够获取由基指针或引用所指向的对象的实际派生类型,即允许“用指向基类的指针或引用来操作对象”的程序能够获取到“这些指针或引用所指对象”的实际派生类型。在C++中,为了支持RTTI提供了两个操作符:dynamic_cast和typeid。

注意:g++ RTTI 开启/关闭:-frtti / -fno-rtti

         在VC6.0运行时,记得把编译选项加上“/GR“ ,否则编译时会出现Warning(工程--设置--C/C++---工程选项)。因为VC6.0默认不开启RTTI

15.1 dynamic_cast

dynamic_cast可以获取目标对象的引用或指针:
T1 obj;
T2* pObj = dynamic_cast<T2*>(&obj);      //转换为T2指针,失败返回NULL
T2& refObj = dynamic_cast<T2&>(obj);    //转换为T2引用,失败抛出bad_cast异常


在使用时需要注意:被转换对象obj的类型T1必须是多态类型,即T1必须公有继承自其它类? 或者T1拥有虚函数(继承或自定义)。若T1为非多态类型,使用dynamic_cast会报编译错误。


问题1:http://bbs.csdn.net/topics/390723010

问题2:以下为出错程序

#include<iostream>

using namespace std;

class A
{
  virtual void func(){};
};

class B:public A
{};
class C:public B
{};

int main()
{
  A a;
  B b;
  C c;
  A *pa = dynamic_cast<A*>(&b);
  if(pa == NULL)
  {
	cout << "子类转父类失败!" << endl;
  }
  else
	cout << "pa = " << pa << endl;
  C *pc = dynamic_cast<B*>(&b);
  if(pc == NULL)
  {
	cout << "父类转子类失败!" << endl;
  }
  else
	cout << "pc = " << pc << endl;
  
  return 0;
}


15.2 typeid



参考文章:

http://wei.si/blog/2012/03/about-dynamic_cast/

http://www.cnblogs.com/weidagang2046/archive/2010/04/10/1709226.html

http://www.cppblog.com/smagle/archive/2010/05/14/115286.aspx

http://www.cnblogs.com/ider/archive/2011/08/01/cpp_cast_operator_part5.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值