C/C++常考面试题(二)
网上看到的面经,说是dynamic_cast的实现,和RTTI的相关,这才发现原来对这个概念这么模糊,所以作了这个总结。
C/C++常考面试题(二)
- 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关键字。
- 该关键字的主要作用是让用户知道当前变量是什么类型的。比如使用typeid(a).name()就可以知道变量a的类型,typeid()返回的是一个const type_info&类型的函数,其头文件为 <typeinfo>现对type_info作一个介绍:
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++常考面试题(二)的更多相关文章
- Java常考面试题(二)
序言 昨天刚开始的”每日5题面试“这类文章,感觉还不错,把一些平常看似懂了的东西,弄清楚了.就像什么是虚拟机?这个问题,看起来知道,但是要说出个所以然来,又懵逼了,经常回过头来看看做过的面试题,试着用 ...
- Java常考面试题(二)(转)
序言 昨天刚开始的"每日5题面试"这类文章,感觉还不错,把一些平常看似懂了的东西,弄清楚了.就像什么是虚拟机?这个问题,看起来知道,但是要说出个所以然来,又懵逼了,经常回过头来看看 ...
- Java常考面试题
Java常考面试题 1. 什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”? 答:Java虚拟机是一个可以执行Java字节码的虚拟机进程.Java源文件被编译成能被Java虚拟机执行 ...
- C/C++常考面试题(一)
这算是一个系列吧,记录一下在准备秋招期间,所准备的C++面试题,望秋招顺利.所有的面试题均来源于各大论坛,网络. C/C++常考面试题(一) 常用的C++数据结构有哪些? vector,序列式容器,相 ...
- C++常考面试题汇总
c++面试题 一 用简洁的语言描述 c++ 在 c 语言的基础上开发的一种面向对象编程的语言: 应用广泛: 支持多种编程范式,面向对象编程,泛型编程,和过程化编程:广泛应用于系统开发,引擎开发:支持类 ...
- C++常考面试题汇总(持续更新中)
c++面试题 一 用简洁的语言描述 c++ 在 c 语言的基础上开发的一种面向对象编程的语言: 应用广泛: 支持多种编程范式,面向对象编程,泛型编程,和过程化编程:广泛应用于系统开发,引擎开发:支持类 ...
- Java常考面试题整理(二)
21.Iterator和ListIterator的区别是什么? 参考答案: 下面列出了他们的区别: Iterator可以用来遍历Set和List集合,但是ListIterator只能用来遍历List. ...
- .net常考面试题
1. 简述 private. protected. public. internal 修饰符的访问权限. 答 . private : 私有成员, 在类的内部才可以访问. protected : 保护成 ...
- 变量和关系符和JAVA基本类型笔记与常考面试题
变量的类型:数值型:整型(byte,short,int,long).浮点型(float,double)非数值型:布尔类型(boolean),字符型(char),字符串类型(String),其他引用型 ...
随机推荐
- Markdown 基本用法
声明:引自 http://www.cnblogs.com/hnrainll/p/3514637.html ,感谢! 1. 标题设置(让字体变大,和word的标题意思一样)在Markdown当中设置 ...
- android 怎么判断activity 从哪里启动的
有时候,你想要知道,有一个activity 从哪里启动的.怎么才能知道呢? 1.前提是,androidstadio 你下载了源码.找到你的activityBase的实现类,在startActivity ...
- Java泛型的基本介绍与使用
为什么要使用泛型? 在Java中增加泛型之前,泛型程序设计是用继承来实现的,例如ArrayList,只维护Object引用的数组: public class ArrayList{ private Ob ...
- 杜绝网上压根没测过就乱写之 《oracle mybatis 返回自增主键 》
面试过好多人,包括自己也属于这么一个情况: 遇到问题直接去网上查,一般都可以查到解决方案.其中也包括一些基本的面试资料的答案. 其实有很多答案也都是正确的,但是还是存在一些压根就是胡乱抄来的答案,也不 ...
- 问题 E: 完数与盈数
问题 E: 完数与盈数 时间限制: 1 Sec 内存限制: 32 MB提交: 73 解决: 69[提交][状态][讨论版][命题人:外部导入] 题目描述 一个数如果恰好等于它的各因子(该数本身除外 ...
- 无缘无故出现npm 解析异常的的问题 解决方案
npm cache clean --force try if false delete package.lock.json try again if false npm set registry ht ...
- kvm-1
yum install libvirt* virt-* qemu-kvm* -y systemctl start libvirtd.service systemctl status libvirtd. ...
- Daily Scrum02 12.03
Daily Scrum03 12.03 一天过去了,新的一天即将到来,我们组仍旧干劲十足呢~ Member Today's Task Tomorrow's Task 李孟 孟神有点累了呢 task85 ...
- J2EE开发实战基础系列一 HelloWorld
开始咱们的第一个程序,首先是配置环境,按照上一章所描述的方式下载开发工具,然后配置Java环境变量,给大家看下具体的结构: 环境变量配置OK的提示,如上图. Eclipse和Tomcat的文件目录位置 ...
- CentOS7中rpm,yum软件安装命令
RPM包常用安装位置说明 /etc/ 配置文件安装目录 /usr/bin/ 可执行的命令安装目录 /usr/lib/ ...