欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 健康 > 美食 > C++ 函数语义学——RTTI(运行时类型识别)回顾与存储位置简介

C++ 函数语义学——RTTI(运行时类型识别)回顾与存储位置简介

2024/10/25 14:33:33 来源:https://blog.csdn.net/qq_68194402/article/details/141110461  浏览:    关键词:C++ 函数语义学——RTTI(运行时类型识别)回顾与存储位置简介

RTTI(运行时类型识别)回顾与存储位置简介

RTTI(运行时类型识别)回顾与存储位置简介

    • RTTI(运行时类型识别)回顾与存储位置简介
      • 1. RTTI(运行时类型识别)简单回顾
        • 示例代码
        • 运行结果
        • 解释
      • 2. RTTI 实现原理
        • 详细解释
      • 3. vptr、vtbl与 RTTI 的 type_info 信息创建时机
      • 总结

1. RTTI(运行时类型识别)简单回顾

RTTI(运行时类型识别)是C++提供的一种机制,用于在运行时识别对象的类型。RTTI主要包括两个操作:

  • typeid 操作符:用于获取对象的类型信息。
  • dynamic_cast 操作符:用于在继承层次中安全地进行类型转换。
示例代码
#include <iostream>
#include <typeinfo>class Base {
public:virtual ~Base() = default;
};class Derived : public Base {};int main() {Base* b = new Derived();// 使用 typeid 获取类型信息std::cout << "Type of b: " << typeid(*b).name() << std::endl;// 使用 dynamic_cast 进行类型转换Derived* d = dynamic_cast<Derived*>(b);if (d) {std::cout << "b is of type Derived" << std::endl;} else {std::cout << "b is not of type Derived" << std::endl;}delete b;return 0;
}
运行结果
Type of b: 7Derived
b is of type Derived
解释
  • typeid 操作符typeid(*b).name()返回一个表示 b 所指向对象类型的字符串。在这个例子中,输出结果是 7Derived,表示 b 指向的是 Derived 类型的对象。7 表示类型名称的长度,Derived 是类型的实际名称。

  • dynamic_cast 操作符dynamic_cast(b) 尝试将 b 转换为 Derived*类型。如果转换成功,返回非空指针;否则,返回空指针。在这个例子中,转换成功,所以输出 b is of type Derived

2. RTTI 实现原理

RTTI 的实现依赖于虚函数表(vtbl)和虚指针(vptr)。每个多态类对象都有一个指向虚函数表的指针(vptr),虚函数表中包含了指向虚函数的指针以及类型信息(type_info)。

详细解释
  • vptr(虚指针):每个多态类对象都有一个隐藏的指针,指向该对象的虚函数表。vptr 在对象构造时被初始化。

  • vtbl(虚函数表):虚函数表是一个指针数组,包含了类的虚函数指针和类型信息。每个多态类都有一个唯一的虚函数表。

  • type_infotype_info 是一个包含类型信息的结构体。编译器在编译时为每个多态类生成一个 type_info 对象,并在运行时通过虚函数表访问它。

3. vptr、vtbl与 RTTI 的 type_info 信息创建时机

  • vptr(虚指针):虚函数指针 vptr 是跟着对象走的,对象创建出来了,才存在vptrvptr也是属于类中的一个成员变量,它是编译器在编译的时候就插进去的,然后vptr的赋值就是在程序运行起来后,程序员创建一个对象的时候,执行编译器插入到构造函数中的赋值代码时才给vptr赋值的,让其指向该类所属的虚函数表。
  • vtbl(虚函数表):虚函数表vtbl是在编译期间就确定好的,跟着类走。
  • type_infoRTTItype_info信息实际上也是编译期间就创建好的。程序员能做的事情就是去读取这些信息。所以不难发现,不管生成多少个类对象,取得的type_info所指向的地址都是相同的。也就是说,这个信息也是基于类的。

总结

  • RTTI:运行时类型识别用于在运行时识别对象的类型,主要通过 typeiddynamic_cast 操作符实现。
  • 实现原理:RTTI 依赖于虚函数表(vtbl)和虚指针(vptr),通过它们在运行时获取类型信息。
  • **type_info **:编译器在编译时为每个多态类生成一个 type_info 对象,并在运行时通过虚函数表访问它。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com