由dynamic_cast想到的

说到类型转换,除了dynamic_cast以外,其余的转换行为都是在编译期间就得以确定的,转换是否成功,并不依赖被转换的对象。
平常用得比较多的,是学生风格的“显式转换”:pb = (B*)pa; 老是有人说这样不好,但是在结构层次比较少、类型简单的时候,我们偏偏喜欢这样偷

懒。如果想养成好的习惯,多使用一些static_cast<int*>这样的转换语句,让自己显得专业一点。如果我看到前面的转换方式,我会觉得这个写程序的

人也许只懂C语言;如果他像后面这么写,那么他至少在用行动体现自己注重“类型安全”,希望踏踏实实地做事情,或者他受过这方面良好的教育、有

比较扎实的基础。

dynamic_cast的作用究竟如何呢?这让我联想到MFC、虚函数等动态机制,还有RTTI(运行时类型识别)。不错,dynamic_cast正是依赖于RTTI信息的。我

对于RTTI的简单理解是:一个对象,只有在具体程序运行的时候,我们才能知道它是一个什么类型(也就是说,在编译的时候,还无法确定)。其次,

dynamic_cast会检查转换的source对象是否真的可以转换成target类型,这种检查不是语法上的,而是真实情况的检查。
(注意几个对应词:运行时->编译时;真实情况检查->语法检查,相关概念:动态联编->静态联编)
先看RTTI部分:通常,许多编译器都是通过vtable(虚地址表,也就是为每个虚函数建立一个地址,在继承层次中构成一张表格)找到对象的RTTI信息的

,这也就意味着,如果基类没有虚方法(注意!),也就无法判断一个基类指针变量所指对象的真实类型, 这时候,dynamic_cast只能用来做安全的转换

,例如从派生类指针转换成基类指针,而这种转换其实并不需要dynamic_cast参与。

在VC6里面开启RTTI的方法:
Project/Settings/"C/C++"  
  Category选“C++   Language”,然后勾选“Enable   Run-time   Type   Information(RTTI)”  

相关的代码例子,参见:http://blog.csdn.net/BlueSoal/archive/2006/12/07/1433429.aspx 或者我的网摘。

另外感兴趣的两个问题:
什么时候必须使用dynamic_cast,什么时候dynamic_cast可以使用static_cast代替,参见:

http://www.cppblog.com/mzty/archive/2008/02/19/42929.html

另一个例子:

http://caterpillar.onlyfun.net/Gossip/CppGossip/dynamicCast.html

想法:

对于兄弟层次的类型之间进行转换,应该注意哪些事情?应用场合?dynamic_cast能够帮助我们保障安全吗?

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值