cast
1. 介绍各种cast(Effective C++ E3, P117)
const_cast通常被用来将对象的常量性转除,唯一有此能力;
dynamic_cast用来执行“安全向下转型”;
reinterpret_cast执行低级转型,不可移植。例如将一个pointer to int 转型为一个int。(static_cast不能胜任)
static_cast用来强迫隐式转换,例如将no-const对象转为const对象,或将int转为double,将void*指针转为typed指针,将pointer-to-base转为pointer-to-derived。可以看作“利用原值重建一个临时对象,并在设立初值时使用型别转换”(The C++SLibrary, P19)
2. static_cast用法题目
1) 分析结果:(Effective C++ E3, P119)
class Base
{
int x;
public:
virtual void SetMe(int x)
{
this->x = x;
}
void Print()
{
cout << x << endl;
}
};
class Derived : public Base
{
int y;
public:
virtual void SetMe(int y)
{
static_cast<Base>(*this).SetMe(y);
this->y = y;
}
void Print()
{
Base::Print();
cout << y << endl;
}
};
int main( void )
{
Derived d;
d.SetMe(100);
d.Print();
return 0;
}
解释:
输出:
-858993460
100
这一行static_cast<Base>(*this).SetMe(y);调用的不是当前对象上的函数,而是转型动作所建立的一个”this对象之base class成分”的临时副本上的SetMe。正确的做法是将其改为Base:: SetMe();