外国人做的学汉字网站,住房及城乡建设部网站,网页设计什么主题好,如何建立竞价网站在程序中#xff0c;当我们对多态类的基类指针使用typeid#xff0c;就可以在运行时确定指针指向对象的实际类型#xff0c;并输出对象类型的名字。 #include cstdlib #include iostream #include typeinfo usingnamespacestd; classB{ public … 在程序中当我们对多态类的基类指针使用typeid就可以在运行时确定指针指向对象的实际类型并输出对象类型的名字。 #include cstdlib #include iostream #include typeinfo using namespace std; class B{ public : virtual void fun(){} }; class D: public B{ public : void fun(){} }; int main() { B * p; D ob; p ob; cout typeid(*p).name() typeid( * p).name() endl; if (typeid( * p) typeid(D)) cout typeid(*p)typeid(D) endl; cout typeid(p).name() typeid(p).name() endl; if (typeid(p) typeid(B * )) cout typeid(p)typeid(B*) endl; system( pause ); return 0 ; } 这段code在VC6.0中编译时提示如下warning C4541: typeid used on polymorphic type class B with /GR-; unpredictable behavior may result编译后运行时错误。不知是不是此版本的VC不符合C标准在Devcppg中编译运行得到的结果是typeid(*p).name()1Dtypeid(*p)typeid(D)typeid(p).name()P1Btypeid(p)typeid(B*)说明用typeid作用于*p得到的的确是D类型而用typeid作用于p得到的依然是B类的指针类型如果typeid被作用于非多态类指针那么我们得到的是指针被声明的类型也就是说此时typeid并不会返回指针所指向对象的实际类型。如果将class B中的virtual去掉在编译运行得到的结果是typeid(*p).name()1Btypeid(p).name()P1Btypeid(p)typeid(B*)由此可见在任何时刻都可以用基类指针指向派生类对象而用typeid(*p)确定p指向的对象时只当基类为多态类时才能真正确定p在运行时指向的实际类型。VC默认不启动RTTI即“运行时期类型识别”如果在你的程序用到了RTTI比如typeid你必须明确告诉编译器启动RTTI这样VC才能正确编译 选择菜单Project-settings-c/c-category-c language,将Enable Run-Time Type Infomation(RTTI)选中