// CPPTest.cpp : 定义控制台应用程序的入口点。
//
class B
{
private:
virtual void Foo(){cout<<"A"<<endl;}
};
class D1:public B
{
public:
//void Foo(){cout<<"D1"<<endl;}
};
class D2:public B
{
public:
//void Foo(){ cout<<"D2"<<endl; }
};
template<typename T2,typename T1>
bool IsKindOf(T1 &t1)
{
return *((long*)&t1)==*((long*)&T2());
}
template<typename T2,typename T1>
bool IsKindOf(T1*t1)
{
return *((long*)t1)==*((long*)&T2());
}
template<typename T2,typename T1>
bool IsDerivedFrom(T1 &t1)
{
if (IsKindOf<T2>(t1))
{
return false;
}
return *(long*)(*((long*)&t1))==*(long*)(*((long*)&T2()));
}
template<typename T2,typename T1>
bool IsDerivedFrom(T1*t1)
{
if (IsKindOf<T2>(t1))
{
return false;
}
return *(long*)(*((long*)t1))==*(long*)(*((long*)&T2()));
}
int main()
{
B*pB=new D1;
if (IsDerivedFrom<B>(pB))
{
cout<<"D1"<<endl;
}
delete pB;
pB=new D2;
if (IsDerivedFrom<D2>(pB))
{
cout<<"D2"<<endl;
}
delete pB;
pB=new D2;
if (IsDerivedFrom<D1>(pB))
{
cout<<"D1"<<endl;
}
delete pB;
return 0;
}