C风格类型转换
double dValue = 3.3;
int nValue = (double)dValue;
C++风格类型转换
double dValue = 3.3;
int nValue = static_cast<int>(dValue);
优点,容易识别,特别是被工具识别; 分工明确,易于在编译时识别错误。
4种C++类型转换
static_cast:强迫隐形转型
dynamic_cast:安全向下类型转换,效率较差
const_cast:将对象常量性移除
reinterpret_cast:意图进行低级转型
dynamic_cast
class Base
{
public:
Base();
virtual ~Base();
virtual void function1();
}
class Derived : public Base
{
public:
Derived();
~Derived();
virtual void function1();
function2();
}
int main()
{
Base* pBasePointer = new Derived();
pBasePointer->function1(); // 调用虚函数直接调用
dynamic_cast<Derived*>(pBasePointer)->function2(); //调用非虚子类函数,虽然是指向子类对象,但还是需要做一个强制转换
}
使用dynamic_cast做强制转换是效率比较低的,应避免使用,可以使用下面这两种方法避免
a. 直接使用子类的指针
Derived* pDerivedPoint = new Derived();
pDerivedPoint->function2();
b. 改为virtual函数
类型转换后实际是产生了一个副本,本身并没有改变,比如下面例子,调用的是一个副本的OnSizeChange,而不是本身基类的这个函数。
class window
{
vitual void OnSizeChange();
}
class derivedWindow : public window
{
virtual void OnSizeChange()
{
static_cast<window>(*this).OnSizeChange(); //调用的是一个副本的OnSizeChange,而不是本身基类的这个函数。
}
}
正确写法
class derivedWindow : public window
{
virtual void OnSizeChange()
{
window::OnSizeChange(); //直接告诉编译器需要调用基类的这个函数
... ...
}
}