网上看到的面经,说是dynamic_cast的实现,和RTTI的相关,这才发现原来对这个概念这么模糊,所以作了这个总结。

C/C++常考面试题(二)

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

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

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

      • typeid操作符,返回指针和引用所指的实际类型
      • dynamic_cast操作符,将基类类型的指针或引用安全的转换为派生类型的指针或引用
    • 在C++中存在虚函数,也就存在了多态性。对于多态性的对象,在程序编译时可能会出现无法确定对象的类型的情况。当类中含有虚函数时,其基类的指针就可以指向任何派生类的对象,这时就有可能不知道基类指针到底指向哪个对象的情况,类型的确定要在运行时利用运行时类型标识做出。

    • typeid关键字

      • 该关键字的主要作用是让用户知道当前变量是什么类型的。比如使用typeid(a).name()就可以知道变量a的类型,typeid()返回的是一个const type_info&类型的函数,其头文件为 <typeinfo>现对type_info作一个介绍:
        class type_info
        {
        private:
        type_info(const type_info&); //type_info类的复制构造函数和赋值运算符是私有的。
        type_info& operator=(const type_info&);
        public:
        virtual ~type_info();//析构函数 //在type_info类中重载了==运算符,该运算符可以比较两个对象的类型是否相等。
        bool operator==(const type_info&)const; //重载的!=运算符,以比较两个对象的类型是否不相等
        bool operator!=(const type_info&)const; //使用得较多的成员函数name,该函数返回对象的类型的名字。
        //前面使用的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的派生类。
      • dynamic_cast的实现也是类似的,通过VTable的一个额外指针来实现的。

C/C++常考面试题(二)的更多相关文章

  1. Java常考面试题(二)

    序言 昨天刚开始的”每日5题面试“这类文章,感觉还不错,把一些平常看似懂了的东西,弄清楚了.就像什么是虚拟机?这个问题,看起来知道,但是要说出个所以然来,又懵逼了,经常回过头来看看做过的面试题,试着用 ...

  2. Java常考面试题(二)(转)

    序言 昨天刚开始的"每日5题面试"这类文章,感觉还不错,把一些平常看似懂了的东西,弄清楚了.就像什么是虚拟机?这个问题,看起来知道,但是要说出个所以然来,又懵逼了,经常回过头来看看 ...

  3. Java常考面试题

    Java常考面试题 1. 什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”? 答:Java虚拟机是一个可以执行Java字节码的虚拟机进程.Java源文件被编译成能被Java虚拟机执行 ...

  4. C/C++常考面试题(一)

    这算是一个系列吧,记录一下在准备秋招期间,所准备的C++面试题,望秋招顺利.所有的面试题均来源于各大论坛,网络. C/C++常考面试题(一) 常用的C++数据结构有哪些? vector,序列式容器,相 ...

  5. C++常考面试题汇总

    c++面试题 一 用简洁的语言描述 c++ 在 c 语言的基础上开发的一种面向对象编程的语言: 应用广泛: 支持多种编程范式,面向对象编程,泛型编程,和过程化编程:广泛应用于系统开发,引擎开发:支持类 ...

  6. C++常考面试题汇总(持续更新中)

    c++面试题 一 用简洁的语言描述 c++ 在 c 语言的基础上开发的一种面向对象编程的语言: 应用广泛: 支持多种编程范式,面向对象编程,泛型编程,和过程化编程:广泛应用于系统开发,引擎开发:支持类 ...

  7. Java常考面试题整理(二)

    21.Iterator和ListIterator的区别是什么? 参考答案: 下面列出了他们的区别: Iterator可以用来遍历Set和List集合,但是ListIterator只能用来遍历List. ...

  8. .net常考面试题

    1. 简述 private. protected. public. internal 修饰符的访问权限. 答 . private : 私有成员, 在类的内部才可以访问. protected : 保护成 ...

  9. 变量和关系符和JAVA基本类型笔记与常考面试题

    变量的类型:数值型:整型(byte,short,int,long).浮点型(float,double)非数值型:布尔类型(boolean),字符型(char),字符串类型(String),其他引用型 ...

随机推荐

  1. APPium-python实例(记录)

    https://github.com/appium/sample-code/tree/master/sample-code/examples/python

  2. 13.0 Excel表格写入

    Excel表格写入 安装 xlutils 和 xlwt Excel写入输入 分两种方式: 第一种是向一张新表之中写入..这种不多说,我几乎没怎么用,直接贴代码 import xlwt Excel_na ...

  3. [ubuntu 18.04 + RTX 2070] Anaconda3 - 5.2.0 + CUDA10.0 + cuDNN 7.4.1 + bazel 0.17 + tensorRT 5 + Tensorflow(GPU)

    (RTX 2070 同样可以在 ubuntu 16.04 + cuda 9.0中使用.Ubuntu18.04可能只支持cuda10.0,在跑开源代码时可能会报一些奇怪的错误,所以建议大家配置 ubun ...

  4. 拉普拉斯矩阵(Laplacian Matrix) 及半正定性证明

    摘自 https://blog.csdn.net/beiyangdashu/article/details/49300479 和 https://en.wikipedia.org/wiki/Lapla ...

  5. 九度OJ--Q1164

    import java.util.Scanner; /* * 题目描述: * 任意输入两个9阶以下矩阵,要求判断第二个是否是第一个的旋转矩阵,如果是,输出旋转角度(0.90.180.270),如果不是 ...

  6. 从零开始搭建一个react项目

    Nav logo 120 发现 关注 消息 4 搜索 从零开始搭建一个react项目 96 瘦人假噜噜 2017.04.23 23:29* 字数 6330 阅读 32892评论 31喜欢 36 项目地 ...

  7. uva 116 Unidirectional TSP(动态规划,多段图上的最短路)

    这道题目并不是很难理解,题目大意就是求从第一列到最后一列的一个字典序最小的最短路,要求不仅输出最短路长度,还要输出字典序最小的路径. 这道题可以利用动态规划求解.状态定义为: cost[i][j] = ...

  8. scrapy学习-爬取天天基金网基金列表

    目录 描述 环境描述 步骤记录 创建scrapy项目 设置在pycharm下运行scrapy项目 分析如何获取数据 编写代码 step 1:设置item step 2:编写spider step 3: ...

  9. lintcode-86-二叉查找树迭代器

    86-二叉查找树迭代器 设计实现一个带有下列属性的二叉查找树的迭代器: 元素按照递增的顺序被访问(比如中序遍历) next()和hasNext()的询问操作要求均摊时间复杂度是O(1) 样例 对于下列 ...

  10. J2EE开发实战基础系列一 HelloWorld

    开始咱们的第一个程序,首先是配置环境,按照上一章所描述的方式下载开发工具,然后配置Java环境变量,给大家看下具体的结构: 环境变量配置OK的提示,如上图. Eclipse和Tomcat的文件目录位置 ...