第18章 特殊工具与技术(7)
18.2.2 typeid操作符
如果表达式的类型是类类型且该类包含一个或多个虚函数,则表达式的动态类型可能不同于它的静态编译时类型。例如,如果表达式对基类指针解引用,则该表达式的静态编译时类型是基类类型;但是指针实际指向派生类对象,则typeid操作符将说表达式的类型是派生类型。
typeid操作符可以与任何类型的表达式一起使用。内置类型的表达式以及常量都可以用作typeid操作符的操作数。如果操作数不是类类型或者是没有虚函数的类,则typeid操作符指出操作数的静态类型;如果操作数是定义了至少一个虚函数的类类型,则在运行时计算类型。
使用typeid操作符
typeid最常见的用于是比较两个表达式的类型,或者将表达式的类型与特定类型相比较。
Base1 *bp=new Base1();
Child1 *cp=new Child1();
if(typeid(*bp)==typeid(*cp)){
}
if(typeid(*cp)==typeid(Child1)){
}
Base1 *bp=new Base1();
Child1 *cp=new Child1();
if(typeid(*bp)==typeid(*cp)){
}
if(typeid(*cp)==typeid(Child1)){
}只有当typeid的操作数是带虚函数的类类型的对象的时候,才返回动态类型信息。测试指针(相对于指针指向的对象)返回指针的静态的、编译时类型。
如果指针p的值是0,那么,如果p的类型是带虚函数的类型,则typeid(*p)抛出一个bad_typeid异常;如果p的类型没有定义任何虚函数,则结果与p的值是不相关的。
摘自 xufei96的专栏
补充:软件开发 , C++ ,