c ++中的typeid行为

时间:2011-01-16 23:52:13

标签: c++

有人可以向我解释为什么这段代码会打印Base,Derived但是如果我从Base print 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();
 }

2 个答案:

答案 0 :(得分:8)

根据typeid的定义,它返回多态类型的表达式的 dynamic 类型和 static 类型的表达式对于非多态类型。

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

在您的情况下,当您致电testClassType(d)时,b函数中的表达式testClassType具有静态类型Base和动态类型Derived。但是,如果Base中没有单个虚拟函数,typeid将始终报告静态类型 - Base。完成Base多态后,代码将报告b的动态类型,即Derived

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

答案 1 :(得分:2)

具有至少一个虚拟成员函数的类称为多态类

多态类的每个实例在运行时都以某种方式关联用于实例化的原始类。这用于例如typeid。还用于调用虚拟成员函数。

当您通过删除f使该类成为非多态时,testClassType中已知的所有内容都是Base。没有运行时检查类型。

干杯&amp;第h。,