c ++中的typeid行为

thi*_*nom 2 c++

有人可以向我解释为什么这个代码打印Base,Derived但是如果我从Base打印Base,Base省略f函数?

#include <iostream>
#include <cstdio>
using namespace std; 

class Base;
void testClassType (Base& b);
class Base
{
 virtual void f(){};
};

class Derived :public Base
{
};

int main ()
{
 Base b;
 Derived d;
 testClassType(b);
 testClassType(d);

}
 void testClassType(Base& b)
 {
  cout<<endl<<"It is:"<<typeid(b).name();
 }
Run Code Online (Sandbox Code Playgroud)

AnT*_*AnT 8

根据定义typeid,它返回多态类型的表达式的动态类型和非多态类型的表达式的静态类型.

多态类型是具有至少一个虚函数的类类型.

在您的情况下,当您调用时testClassType(d),函数b内部的表达式testClassType具有静态类型Base和动态类型Derived.但是,如果没有单个虚函数Base,typeid将始终报告静态类型 - Base.一旦你创建了Base多态,代码就会报告动态类型b,即Derived.

最重要的是,正如Oli在评论中正确指出的那样,type_info::name()方法的结果不能保证包含任何有意义的信息.它可以"Hello World"为所有类型返回相同的字符串.