网上看到的面经,说是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. 如何将h5网页改成微信网页

    1.如何将h5网页改成微信网页 1.设置安全域名          先登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”.         备注:登录后可在“开发者中心”查看对 ...

  2. Android Studio modify language level to Java 8

    If you need use lambda, should modify language level File -> Project Structure -> app -> Pr ...

  3. 初步学习pg_control文件之十三

    接前文,初步学习pg_control文件之十二 看这个: * backupStartPoint is the redo pointer of the backup start checkpoint, ...

  4. jetbraints激活码

    G91XMO9AVI-eyJsaWNlbnNlSWQiOiJHOTFYTU85QVZJIiwibGljZW5zZWVOYW1lIjoic29uZyB3YW5nIiwiYXNzaWduZWVOYW1lI ...

  5. 触发显示和隐藏 div

    <script> window.onload = function(){ var oDiv1 = document.getElementById("div1"); va ...

  6. LINUX网络相关命令(转)

    网络连通性 Ping:发送一个 ICMP 回声请求消息给主机,一直持续到到你按下 Ctrl+C .Ping 表示一个包通过 ICMP 从你的机器发送出去,然后在IP层得到回应.Ping 可以检测你与另 ...

  7. 通过修改Host文件解决主机头访问网站的问题

             网站打包发布后,一般都是通过IP地址来进行访问,但是这样不方便记忆.如何设置一个简单的域名,然后通过域名来进行访问呢?一个可行的方法就是修改本机的host文件,添加一条映射关系,把这 ...

  8. android中activity,window,view之间的关系

    activity:控制单元 window:承载模型 view:显示视图 几个小tip: 1.一个 Activity 构造的时候一定会构造一个 Window(PhoneWindow),并且只有一个 2. ...

  9. java 判断上午/下午

    //结果为“0”是上午 结果为“1”是下午 public class GregorianTest { public static void main(String args[]) { Gregoria ...

  10. android:保存用户名密码等应用程序数据

    转自http://blog.sina.com.cn/s/blog_a73687bc0101dsjj.html (一)使用SharedPreferences  1.保存信息: SharedPrefere ...