Second Edition
18.9新的映射语法无论什么时候用类型映射,都是在打破类型系统,这实际上是在告诉编译器,即使知道一个对象的确切类型,还是可以假定认为它是另外一种类型。这本身就是一种很危险的事情,也是一个容易发生错误的地方。不幸的是,每一种类型映射都是不同的:它是用括号括起来的目标类型的名字。所以如果我们的一段代码不能正确工作,而我们知道应该检查所有的类型映射看它们是否是产生错误的原因。我们怎么保证可以找出所有的类型映射呢?在一个C程序中无法做到这一点。因为C编译器并不总是要求类型映射(它可以用一个void指针指向不同的类型而不必强迫使用映射),而映射表现不同,所以我们不知道我们是不是已经找出所有的映射了。
为了解决这个问题,C++用保留字dynamic_cast (本章第一部分的主题)、const_cast、static_cast和reinterpret_cast来提供了一个统一的类型映射语法。当需要进行动态映射时,这就提供了一个解决问题的可能。这意味着那些已有的映射语法已经被重载得太多了,不能再支持任何其他的功能了。通过使用这些映射来代替原有的(new type)语法,我们可以在任何程序中很容易地找出所有的映射。为了支持已有的代码,大多数编译器都可以产生不同级别的错误或警告,并可由用户对错误或警告产生选择打开或关闭。如果把新类型映射的全部错误打开的话,就可以确保我们找出项目中所有的类型映射,这使得查找错误变得很容易。
下表指出了四个不同形式的映射的含义:
-
static_cast: 为了“行为良好”和“行为较好”而使用的映射,包括一些我们可能现在不用的映射(如向上映射和自动类型转换)
-
const_cast: 用于映射常量和变量(const和volatile)
-
dynamic_cast: 为了安全类型的向下映射(本章前面已经介绍)
-
reinterpret_cast: 为了映射到一个完全不同的意思。这个关键词在我们需要把类型映射回原有类型时要用到它。我们映射到的类型仅仅是为了故弄玄虚和其他目的。这是所有映射中最危险的
这些映射类型可以在实际应用中有很多种变体。Hibernate类型映射与Java类型对照中的各种映射类型可以在Hibernate类型映射和Java数据类型与Hibernate的类型映射中找到详尽的说明。而在C语言中,类似的映射概念和编译器相关信息可以参考C编程纹理映射OPENGL和C C++ 编译器标志从其他编译器映射到Visual C++ 编译器cl.exe。