[英]Strange behavior of run-time type information
我有两个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需要至少一种虚拟方法?
因为语言规范是这样说的。 RTTI仅适用于多态类型。 即具有虚函数的类型。 对于其他类型, typeid
返回其参数的静态类型的类型信息。
如果您要求这样做的理由:它具有运行时成本(通常,每个对象中的指向每个类元数据的指针,该指针同时支持虚拟调度和RTTI),如果您这样做,那将是很可惜的无论您是否要对它们使用RTTI,都必须为所有类型支付该价格。
1)引用代表类型类型的std :: type_info对象。 如果type是引用类型,则结果引用引用的类型。
2)检查表情表达
a) 如果expression是一个glvalue表达式,它标识多态类型的对象 (即,一个声明或继承了至少一个虚函数的类), 则typeid表达式将评估该表达式,然后引用该std :: type_info对象,表示表达式的动态类型 。 如果求值表达式的结果为空指针,则抛出std :: bad_typeid类型或从std :: bad_typeid派生的类型的异常。
b) 如果expression不是多态类型的glvalue表达式,则typeid不评估该表达式,并且它标识的std :: type_info对象表示该表达式的静态类型 。 不执行左值到右值,数组到指针或函数到指针的转换。
因此,这种行为是可以预期的,因为在一种情况下该类是多态的,而在另一种情况下则不是。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.