杰表技术论坛 's Archiver

admin 发表于 2018-7-10 10:27

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]

Powered by Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.