1 继承自C语言的强制类型转换
C语言强制类型转换
(类型)待转换值
2 C++新增的标准转换
C++新增的标准转换方法:
(1)static_cast<类型>(待转换值)
(2)dynamic_cast <类型>(待转换值)
(3)const_cast <类型>(待转换值)
(4)reinterpret_cast <类型>(待转换值)
3 两种转换结果大不相同
(1)C语言风格的强制类型转换,不智能,不会转变地址值。
说明:以下举例仅仅是举例,在实际代码中不应该有这种危险写法。
#include <iostream>
using namespace std;
int main()
{
A *pa = new A();
pa->f();
B* pb = (B*)pa; // C语言风格的强制转换
cout << "pa = " << pa << endl;
cout << "pb = " << pb << endl;
pb->f();
return 0;
}
结果如下:
可以看到,转换前后的地址值压根没变,所以调的还是a的方法。此时如果使用指针pb调一个B类有的而A类没有的方法,会崩溃。
(2)C++语言风格的强制类型转换,很智能,但是会出别的问题。
相同的例子,只是把C风格的强制转换替换成C++风格,如下:
#include <iostream>
using namespace std;
int main()
{
A *pa = new A();
pa->f();
B* pb = dynamic_cast<B*>(pa); // C++语言风格的强制转换
cout << "pa = " << pa << endl;
cout << "pb = " << pb << endl;
pb->f();
return 0;
}
结果,pb->f()直接发生崩溃,如下:
因为dynamic_cast是个动态转换。它认为:父类对象的指针转成子类指针,就是nullptr。
Note1:
dynamic_cast用于父子类型之间的转换时,要求父类型至少有一个virtual函数。否则,编译报错。
Note2:
类对象是nullptr的时候,也可以调类对象的函数,但是有两点要求:
(1)所调的函数不是虚函数
(2)函数里面没有使用到成员变量
即,不能使用this指针,也不能使用动态绑定。
Tips:
如果想要和C一样的效果,在C++里面要用static_cast。上面的例子中,把dynamic_cast换成static_cast就和C语言转换的效果一样了。