运行时类型信息的奇怪行为
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 对象。如果 类型是引用类型,结果引用引用的类型。
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 或 不执行函数到指针的转换。
因此,行为是预期的,因为在一种情况下,类是多态的,而在另一种情况下则不是。
- Keil armcc 生成类型信息名称,即使使用 --no_rtti_data
- 错误:未定义对"静脉类型信息::电池访问"的引用
- 如何在编译过程中输出C 类型信息
- 如何在C 中检查确切的类型信息(具有CV-REF-POIRT特征)
- 共享库中非模板基的模板子类导致未定义的符号类型信息'class'链接错误
- 为什么C++不使用集中存储类型信息以实现高效的 RTTI
- 给定DDS主题名称,可以在运行时确定主题类型信息
- 使用友元函数从多态类中检索类型信息
- 如何在函数模板中隐式推导数组中元素的类型信息
- 使用标准类型的动态类型信息实例化标识符
- 超载功能没有上下文类型信息
- 对"vtable for "命名空间继承的未定义引用 对"类型信息"的未定义引用
- 多映射插入键类型信息 std::make_pair vs std::p air 构造函数
- Visual Studio-使用PDB进行调试,但缺少类型信息
- 如何在不同的上下文(例如线程)中保留原始异常类型信息
- C++正在传输运行时条件类型信息
- C++虚拟表上的虚拟定义器和类的类型信息
- C++测试宏定义的类型信息值
- 编译器不可知的运行时类型信息
- C++类型信息