C++中要想在运行时获取类型信息,可没有Java中那么方便,Java中任何一个类均可以经过反射机制来获取类的基本信息(接口、父类、方法、属性、Annotation等),并且Java中还提供了一个关键字,能够在运行时判断一个类是否是另外一个类的子类或者是该类的对象,但C++却没有这么多功能,C++中得到类信息只能经过RTTI机制,并且功能仍是颇有限的,由于C++中最终生成的代码是直接与机器相关的,而Java中会生成字节码文件,再由JVM加载运行,字节码文件中能够含有类的信息。ide
C++中RTTI的简单源程序示例:函数
class A{ private: int a; }; class B{ public: //加一个虚函数 virtual void f(){} }; class C:public B { public : void f(){}; }; class D:public A { public: void f(){} }; int main() { int a=2; //打印出int cout<<typeid(a).name()<<endl; A objA; //打印出class A cout<<typeid(objA).name()<<endl; B objB; //打印出class B cout<<typeid(objB).name()<<endl; C objC; //打印出class C cout<<typeid(objC).name()<<endl; /* //如下是多态在VC 6.0编译器不支持,可是在GCC以及微软更高版本的编译器却都是 //支持的,且是在运行时候来肯定类型的,而不是在编译器,会打印出class c B *ptr=new C(); cout<<typeid(*ptr).name()<<endl; */ A *ptr=new D(); //打印出class A而不是class D cout<<typeid(*ptr).name()<<endl; return 0; }
要想理解上述代码:咱们须要明白如下几个事实spa
1:typeid是一个关键字对象
2:typeid的结果有时候在编译期肯定有时间会在执行期肯定接口
3:typeid运行时,会将判断的结果存储在一个consttypeinfo&对象中ip
4:不一样的编译器对typeid运算的结果差别很大,例如在VC 6.0与G++编译器中,G++编译器支持运行时动态肯定类型,而VC 6.0则不支持。编译器
1:typeid是一个关键字,能够在任意一本C++入门书中看到,typeid是一个关键字,像Sizeof同样,要是函数的话,函数传参你有见过这样的吗typeid(int),直接传int,而不是传一个整型值的,我是没见过:)it
2:看看上述的程序,你会发现上述程序中除了多态的那一部份(在VC 6.0中是没法编译经过的),其余的均是在编译期运行,多态的会在执行期去运行,为了更具说服务力,看看下面的代码,是上面程序的部分汇编代码:io
30: //打印出int 31: const type_info &t=typeid(a);//从下面的汇编代码中能够看出类型在编译期就已经肯定了 004011C4 mov dword ptr [ebp-14h],offset int `RTTI Type Descriptor' (00441e08) 32: cout<<t.name()<<endl; 004011CB push offset @ILT+35(std::endl) (00401028) 004011D0 mov ecx,dword ptr [ebp-14h]
从上面的程序,能够看出对于不是多态类型的,直接在编译器就解决了类型的肯定,这样有利于减小程序的运行时间编译
对于多态类型:
未完,明天再写吧