为了叙述方便,定义类A,B,C,D,E,假设 A 是B,C的基类,B 是D,E的基类。并且都定义了一个指针pa,pb,pc,pd,pe 。
1.dynamic_cast:(1)向上转换,比如把pd转换成pb,把pb转换成pa。如pa=dynamic_cast<A *>(pb);,pb=dynamic_cast<B *>(pd);
(2)对VOID的转换,可以让void*的指针连续指向类的对象。
(3)向下转换,(用于多态性)把pa转换成pb,pc,但要注意,如果定义了一个pa是指向B的,那么 pb=dynamic_cast<B *>(pa)//可以 pc=dynamic_cast<C *>(pa)//也可以但是pa=NULL now.所以你可以用一个判断语句如if(dynamic_cast<B *>(pa))来判断是否可以成功转换。
2.static_cast:(1)向上转换,(一样)
(2)向下转换,和dynamic_cast不同的是,不过pa指向类型B或者C,都可以转换成类B的,如pa指向c的类型,但是pb=static_cast<B *>(pa)依然可以转换,并使他们有同样的地址(盲目的),所以在使用时要注意,避免错误的发生。
(3)类型转换的功能,比如把char装换成int之类的,(不是指针)。
_____________________________________________________________________
#include <iostream>
using namespace std;
class A
{
public:
virtual void fun(){cout<<"A::"<<endl;}
};
class B:public A
{
public:
virtual void fun(){cout<<"B::"<<endl;}
};
class C:public A
{
public:
virtual void fun(){cout<<"C::"<<endl;}
};
class D:public B
{
public:
virtual void fun(){cout<<"D::"<<endl;}
};
class E:public B
{
public:
virtual void fun(){cout<<"E::"<<endl;}
};
void main()
{
A *pa;
B *pb;
C *pc;
D *pd;
E *pe;
pe=new E;
pe->fun();
pa=pe;
pa->fun();
pb=dynamic_cast<B*> (pe);
pb->fun();
pa=dynamic_cast<A*> (pe);
if(pa==NULL)
cout<<"pc=NULL"<<endl;
else
pa->fun();
pd=dynamic_cast<D *> (pb);//run error
if(pd==NULL)
cout<<"pd=NULL"<<endl;
else
pd->fun();
能编译但是不能运行,最后一个转换不行
pd=static_cast<D *> (pb);//ok
E::
E::
E::
E::
E::
以上为输出结果
}