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

Strange behavior of run-time type information

本文关键字:类型 信息 运行时      更新时间:2023-10-16

我有两个类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需要至少一种虚拟方法?

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

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

太长了,无法发表评论。

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

2) 检查表达式表达式

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

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

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