为什么使用 C 语言 风格的强制转换可以把想要的任何东西转换成合乎心意的类型。那为什么还需要一个新的 C++ 类型的强制转换呢?
新类型的强制转换可以提供更好的控制强制转换过程,允许控制各种不同种类的强制转换。C++ 中风格是static_cast
static_cast 可以实现 C++ 中内置基本数据类型之间的相互转换。
int c=static_cast<int>(7.987);
如果涉及到类的话,static_cast 只能在有相互联系的类型中进行相互转换,不一定包含虚函数。
class A
{
};
class B:public A
{
};
class C
{
};
int main()
{
A* a=new A;
B* b;
C* c;
b=static_cast<B>(a); // 编译不会报错, B类继承A类
c=static_cast<B>(a); // 编译报错, C类与A类没有任何关系
return 1;
}
const_cast 操作不能在不同的种类间转换。相反,它仅仅把一个它作用的表达式转换成常量。它可以使一个本来不是 const 类型的数据转换成 const 类型的,或者把 const 属性去掉。
reinterpret_cast 有着和 C 风格的强制转换同样的能力。它可以转化任何内置的数据类型为其他任何的数据类型,也可以转化任何指针类型为其他的类型。
它甚至可以转化内置的数据类型为指针,无须考虑类型安全或者常量的情形。不到万不得已绝对不用。
其他三种都是编译时完成的,dynamic_cast 是运行时处理的,运行时要进行类型检查。
不能用于内置的基本数据类型的强制转换。
dynamic_cast 转换如果成功的话返回的是指向类的指针或引用,转换失败的话则会返回 NULL。
使用 dynamic_cast 进行转换的,基类中一定要有虚函数,否则编译不通过。
B 中需要检测有虚函数的原因:类中存在虚函数,就说明它有想要让基类指针或引用指向派生类对象的情况,此时转换才有意义。
这是由于运行时类型检查需要运行时类型信息,而这个信息存储在类的虚函数表中,只有定义了虚函数的类才有虚函数表。
在类的转换时,在类层次间进行上行转换时,dynamic_cast 和 static_cast 的效果是一样的。在进行下行转换时,dynamic_cast 具有类型检查的功能,比 static_cast 更安全。
向上转换即为指向子类对象的向下转换,即将父类指针转化子类指针。向下转换的成功与否还与将要转换的类型有关,即要转换的指针指向的对象的实际类型与转换以后的对象类型一定要相同,否则转换失败。