运行时类型信息的奇怪行为

时间:2015-01-22 15:47:43

标签: c++ rtti typeid

我有两个课程BaseDerived,因此:

class Base
{
public:
};

class Derived : public Base
{
public:
};

和主要功能:

int main()
{
    Base* ptr = new Derived;

    std::cout << typeid(*ptr).name() << endl;

    delete ptr;

    system("pause");
}

节目输出会显示class Base,我预计会显示class Derived。但是,当我在Base课程中添加虚拟方法时,现在输出会显示class Derived

为什么RTTI至少需要一个虚拟方法?

2 个答案:

答案 0 :(得分:4)

因为语言规范是这样说的。 RTTI仅适用于多态类型;也就是说,具有虚函数的类型。对于其他类型,typeid返回其参数的静态类型的类型信息。

如果您要求理由:它具有运行时成本(通常,每个对象中的指针指向每个类的元数据,它支持虚拟调度和RTTI),它会如果你不得不为所有类型支付这个价格,无论你是否想在它们上使用RTTI,都是一种耻辱。

答案 1 :(得分:0)

Too long for a comment.

  

1)引用表示类型类型的std :: type_info对象。如果   type是引用类型,结果引用引用的类型。

2)   检查表达式表达式

a)如果表达式是glvalue   标识多态类型对象的表达式(即a   声明或继承至少一个虚函数的类,   typeid表达式计算表达式然后引用   std :: type_info对象,表示动态类型   表达即可。如果求值表达式的结果为null   指针,std :: bad_typeid类型的异常或派生自的类型   抛出std :: bad_typeid。

b)如果表达不是glvalue   表达多态类型,typeid不评估   表达式,它标识的std :: type_info对象代表   表达式的静态类型。 Lvalue-to-rvalue,array-to-pointer,或   不执行函数到指针的转换。

因此,行为是预期的,因为在一种情况下,该类是多态的,而在另一种情况下,它不是。