● C++中可使用两种旧式风格的类型转换:
1> (T) expression C风格
2> T(expression) 函数风格
● C++也提供了新式风格的类型转换:
1> const_cast<T>(expression) 去掉对象的常量属性
2> dynamic_cast<T>(expression) 向下安全的类型转换
3> reinterpret_cast<T>(expression) 低级操作,因为依赖实现所以无法移植
4> static_cast<T>(expression) 强制的隐式类型转换:non-const -> const、int <-> double、void* ptr -> typed ptr、base ptr -> derived ptr
● 类型转换会生成代码,无论是显式的cast语句,还是隐式的编译器行为。
因为在大多数的计算机体系里,int和double的表示是不同的,所以这里的类型转换会生成相关的代码,然后再执行浮点数除法。
这是把派生类对象的指针,隐式类型转换为基类指针。其实有时二者的值是不一样的。这时,就要加一些偏移量才能得到基类指针。换言之,一个对象会有多个地址。这和C、Java、C#都不同。
如果使用多重继承,这种情况一定发生;单重继承时也可能发生。而且,这种情况是随编译器而变化的,不是常常发生。
所以,类型转换不能太随便。把对象地址转成char*,对指针进行数学运算,都非常可能会产生未定义行为。
● 看上去正确的未必正确
程序中的static_cast并没有调用*this的onResize函数,而是创建了一个临时拷贝,然后调用了该拷贝的onResize函数。用旧式风格类型转换,结果也一样。
应该修改为:
● dynamic_cast运行时消耗很大,尽量避免。下面的编程风格尤其要避免: