说到类型转换,除了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能够帮助我们保障安全吗?