当前位置:职场发展 > C/C++面试常见问题(二)

C/C++面试常见问题(二)

  • 发布:2023-09-30 03:50

-->

我在网上看到的采访说是dynamic_cast的实现,和RTTI有关。我这才意识到我对这个概念是如此的模糊,所以我做了这个总结。

C/C++面试常见问题(二)

  1. RTTI(Runtime Type Information,运行时类型信息)

    • 它提供了一种在运行时确定对象类型的方法。运行时类型信息使程序能够使用基类的指针或引用来检查这些指针或引用所指向的对象的实际派生类型。

    • RTTI提供了以下两个非常有用的运算符:

      • typeid 运算符,返回指针和引用所指向的实际类型
      • dynamic_cast 运算符,将基类类型的指针或引用安全地转换为派生类型的指针或引用
    • C++中有了虚函数,就有了多态性。对于多态对象,程序编译时可能无法确定对象的类型。当类包含虚函数时,其基类指针可以指向任何派生类对象。这时,可能不知道基类指针指向哪个对象。必须使用运行时类型在运行时确定类型。标志制作。

    • typeid 关键字

      • 该关键字的主要作用是让用户知道当前变量是什么类型。例如,您可以使用 typeid(a).name() 来了解变量 a 的类型。 Typeid()返回一个const type_info& type的函数,它的头文件是我们先来介绍一下type_info: 类类型信息
        {
        私人:
        类型信息(常量类型信息&); //type_info类的复制构造函数和赋值运算符是私有的。
        type_info& 运算符=(const type_info&);
        大众:
        virtual ~type_info();//析构函数//type_info类中重载了==运算符,可以比较两个对象的类型是否相等。
        布尔运算符==(const type_info&)const; //重载!=运算符来比较两个对象的类型是否不相等
        布尔运算符!=(const type_info&)const; //比较常用的成员函数名,这个函数返回的是对象的类型名。
        //前面使用的typeid(a).name()调用这个成员函数
        const char* name()const;
        bool before(const type_info&);
        };

        由于type_info的构造函数和赋值运算符是私有的,因此用户不允许自己创建type_info的对象。使用 type_info 的唯一方法是使用 typeid 关键字。

    • dynamic_cast 运算符

      • 该转换运算符用于将指向派生类的基类指针或引用转换为指向派生类的指针或引用,注意,dynamic_cast 只能用于包含虚函数的类,其表达式为dynamic_cast<类型>(表达式),其中类型指的是要转换为表达式的目标类型。
      • dynamic_cast 不是恒定时间操作。为了确定强制类型转换是否能够完成,必须在运行时执行一些转换细节。因此,在使用dynamic_cast时,应该权衡对性能的影响。
    • RTTI意识到

      • RTTI通常通过在 VTable 中放置一个额外的指针来实现这一点。这个指针指向一个描述具体类型的typeinfo结构体(这个结构体是否与前面的type_info相同有待讨论)(每个新类只生成一个typeinfo实例),所以typeid()表达式的作用实际上是很简单。 VPtr 使用 来获取 typeinfo 的指针,然后生成对 typeinfo 结构体的引用,然后调用库中的例程来判断原始 typeinfo 是否与目标 typeinfo 相同,或者是目标 typeinfo 的派生类。
      • -->

相关文章