Table of Contents
旧式转型
(T)expression // C style.
T(expression) // function style.
New C++ 转型
const_cast
把 常量属性 移除。
dynamic_cast
安全向下转型,当你有一个base指针。但是想访问它指向的派生类时使用。
reinterpret_cast
比如把指针变成int,或者把float编程int
static_cast
强迫隐式转换
指导原则
尽量都使用新的类型转换。
类型转换可能会产生代码
example 01.
int x,y;
double d = static_cast<double> (x)/y;
example 02.
class Base {...};
class Derived: public Base { ... };
Derived d;
Base *pb = &d;
以上两个例子均有可能产生代码。
如何调用基类的函数
错误的示例
class Window{
public:
virtual void onResize() {...}
};
class SpecialWindow: public Window{
public:
virtual void onResize(){
static_cast<Window>(*this).onResize();//这里的转型会产生一个临时对象。
// 所以onResize是调用的临时对象上的onResize
}
};
正确示例,拿掉转型
class SpecialWindow:public Window{
public:
virtual void onResize(){
Window::onResize(); // 调用本对象身上的onResize()
}
};
避免使用 dynamic_cast
dynamic_cast
可能非常慢
方法一
使用容器,并直接使用指向派生类的指针。而不是存储基类的指针。(本质上是避免通过基类指针去访问派生类的方法)
方法二
把要用到的方法放到基类中来。基类中默认实现一个什么也不做的方法。
要尽量避免的错误示例
class Window {...};
typedef std::vector<std::tr1::shared_ptr<Window>> VPW;
VPW winPtrs;
for (VPW::iterator iter = winPtrs.begin();
iter != winPtrs.end(); ++iter)
{
if (SpecialWindow1 *psw1 == dynamic_cast<SpecialWindow1 *>(iter->get())) {...}
else if (SpecialWindow2 *psw2 = dynamic_cast<SpecialWindow2 *> (iter->get())) {...}
...
}
最后
优良的C++代码很少使用转型。