dynamic_cast & static_cast

为了叙述方便,定义类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::

以上为输出结果

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值