c++ RTTI 如何实现的?
A * a = ...;if(B * b = dynamic_cast<B *>(a)){
// 如果 a 与 B 有继承关系,即 a 是从B继承,相等,基类
}
[font=Arial, sans-serif][size=13.65px]class A{virtual ~A(){};};[/size][/font]
[font=Arial, sans-serif][size=13.65px]class B:public A{};[/size][/font]
[font=Arial, sans-serif][size=13.65px]A*a=new B;[/size][/font]
[font=Arial, sans-serif][size=13.65px]B*b =dynamic_cast<B*>(a);[/size][/font]
[font=Arial, sans-serif][size=13.65px]相当于c:[/size][/font]
[font=Arial, sans-serif][size=13.65px]void A_dtor(A* ){}[/size][/font]
[font=Arial, sans-serif][size=13.65px]typeinfo A_RTTI(){[/size][/font]
[font=Arial, sans-serif][size=13.65px]static typeinfo[/size][/font]
[font=Arial, sans-serif][size=13.65px]return typeinfo("A");[/size][/font]
[font=Arial, sans-serif][size=13.65px]}[/size][/font]
[font=Arial, sans-serif][size=13.65px]//编译器生成[/size][/font]
[font=Arial, sans-serif][size=13.65px]void(*)() A_vtbl[]={A_dtor,A_RTTI};[/size][/font]
[font=Arial, sans-serif][size=13.65px]struct A{[/size][/font]
[font=Arial, sans-serif][size=13.65px]A_vtbl*vptr;[/size][/font]
[font=Arial, sans-serif][size=13.65px]};[/size][/font]
[font=Arial, sans-serif][size=13.65px]A_ctor(){vptr=A_vtbl;}[/size][/font]
[font=Arial, sans-serif][size=13.65px]//编译器生成[/size][/font]
[font=Arial, sans-serif][size=13.65px]void B_dtor(B* ){}[/size][/font]
[font=Arial, sans-serif][size=13.65px]typeinfo B_RTTI(){[/size][/font]
[font=Arial, sans-serif][size=13.65px]static typeinfo[/size][/font]
[font=Arial, sans-serif][size=13.65px]return typeinfo("B");[/size][/font]
[font=Arial, sans-serif][size=13.65px]}//compiler generated[/size][/font]
[font=Arial, sans-serif][size=13.65px]void(*)(B*) B_vtbl[]={B_dtor,B_RTTI};[/size][/font]
[font=Arial, sans-serif][size=13.65px]struct B{[/size][/font]
[font=Arial, sans-serif][size=13.65px]B_vtbl*vptr;[/size][/font]
[font=Arial, sans-serif][size=13.65px]};[/size][/font]
[font=Arial, sans-serif][size=13.65px]B_ctor(){vptr=B_vtbl;}[/size][/font]
//[font=Arial, sans-serif][size=13.65px]//编译器生成[/size][/font]
[font=Arial, sans-serif][size=13.65px]B* Dynamic_Cast(A*a ){[/size][/font]
[font=Arial, sans-serif][size=13.65px]if(*((a->vptr)+1)()==B_RTTI())[/size][/font]
[font=Arial, sans-serif][size=13.65px]return a;[/size][/font]
[font=Arial, sans-serif][size=13.65px]return 0;[/size][/font]
[font=Arial, sans-serif][size=13.65px]}[/size][/font]
页:
[1]