// 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;
}