staic_cast静态强制;
不能在无关的指针之间进行static类型强制
class CAnimal
{
//...
public:
CAnimal(){}
};
class CGiraffe:public CAnimal
{
//...
public:
CGiraffe(){}
};
int main(void)
{
CAnimal an;
CGiraffe jean;
an = static_cast<CAnimal>(jean);//将对象jean强制成CAnimal类型
return 0;
}
dynamic_cast的主要目的是:
1)它返回派生类对象的地址;
2)它测试基类指针是否指向下一尖括号<>中所指定类型的对象
dynamic_cast是一个运行时类型信息,dynamic_cast运算符将指向派生对象的基类部分的基类指针转变为指向派生对象的派生类指针,dynamic_cast必须严格地指定与派生对象相同的类,或者它返回NULL指针;
class CAnimal
{
//...
};
class CGiraffe:public CAnimal
{
//...
};
class CGoat:public CAnimal
{
//...
};
int main()
{
CGiraffe gene;
CAnimal * aptr = &gene;
CGiraffe * ptr1,* ptr2;
ptr1 = dynamic_cast<CGiraffe *>(aptr);
ptr2 = dynamic_cast<CGoat *>(aptr); //return NULL
return 0;
}
static_cast与dynamic_cast
关键词: dynamic_cast static_cast
动态强制把测试与强制转换结合到一起,即先进行类型检查(运行时类型检查),如果能转换就转换否则返回空指针。也就是说,在你不知道(或无法确定)指针所指对象具体类型时,可以使用dynamic_cast进行强制转换。static_cast用于基类到派生类的转换,且不作类型检查如:
class CBase
{};
clase CDriver:public CBase
{};
void f(CBase * pB)
{
//CDriver * pD = (CDriver *)pB;
CDriver *pD = static_cast<CDriver*>(pB);
}
void main()
{
CBase * pBase = new CDriver;
//call f
f(pBase);
}
1。dynamic_cast:运行时检查,用于多态的类型转换(upcast,downcast和crosscast),只能转换指针和引用。
2。static_cast:编译时检查,用于非多态的转换,可以转换指针及其他,比如:int->float还可以逆隐式转换,比如:比如:int->char。It is left to the programmer to ensure that the results of a static_cast conversion are safe.
3。对于指针的转换:The dynamic_cast and static_cast operators move a pointer throughout a class hierarchy. However, static_cast relies exclusively on the information provided in the cast statement and can therefore be unsafe.这与dynamic_cast使用rtti的检查是不同的。