实现自己的dynamic_cast

// CPPTest.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
  template <class D,class B>
D& Dynamic_cast(B&b)
{  
   //去掉以下的注释即可模拟自己的dynamic_cas
   /*if (*((unsigned long*)&b)!=*(unsigned long *)&D())
    {
        throw (B());
    }*/
   *(( unsigned long *)&b)=*(unsignedlong *)&D();
   return *((D*)&b);
}
 
class B{
protected :
   int _i;
public :
   B( int ii=10):_i(ii){}
   virtual int Foo( int j=10){
      cout<<"B::Foo:"<<j<<" "<<_i<<endl;
      return _i;
   }
   void Func(){
      cout<<"B::Func:"<<_i<<endl;
   }
   int i(){
      return _i;
   }
};
class D: public B{
public :
   virtual int Foo( int j=10){
      cout<<"D::Foo:"<<j<<" "<<_i<<endl;
      return _i;
   }
};
 
 
int main()
{
   B*pB;
   B b(20);
   pB=&b;
   cout<<*(DWORD_PTR*)&b<<endl;
   //memcpy(&b,&D(),sizeof(DWORD_PTR));
    Dynamic_cast<D>(b);
   cout<<*(DWORD_PTR*)&b<<endl;
   (B*)((&b))->Foo();                      //不能调用D类的Foo
   pB->Foo();                                  //调用了D类的Foo;
   return 0;
}
 
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值