我有两个课程Base
和Derived
,因此:
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至少需要一个虚拟方法?
答案 0 :(得分:4)
因为语言规范是这样说的。 RTTI仅适用于多态类型;也就是说,具有虚函数的类型。对于其他类型,typeid
返回其参数的静态类型的类型信息。
如果您要求理由:它具有运行时成本(通常,每个对象中的指针指向每个类的元数据,它支持虚拟调度和RTTI),它会如果你不得不为所有类型支付这个价格,无论你是否想在它们上使用RTTI,都是一种耻辱。
答案 1 :(得分:0)
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,或 不执行函数到指针的转换。
因此,行为是预期的,因为在一种情况下,该类是多态的,而在另一种情况下,它不是。