C++面试题总结
来源:互联网 发布:阿里云 王坚 年会 哭 编辑:程序博客网 时间:2024/05/29 19:45
为什么C++的member function template不能是虚的?
问题的意思是:为什么在C++里面,一个类的成员函数不能既是template优势virtual,比如,下面的代码是不合法的:
class Animal{public: template<typename T> virtual void make_sound(){ //... } };
原因如下:
1. 从Uuix/C开始,一个C/C++程序就可以被分开编译,然后用一个linker链接起来。这种模型有有一个问题,就是各个编译单元可能对另一个编译单元一无所知。
2. 一个function template最后到底会被实例化为多少个函数,要等到整个程序(所有的编译单元)全部被编译完成才知道。
3. 同时,虚函数的实现大多利用了一个“虚函数表”的东西,这种实现中,一个类的内存布局(或者说虚函数表的内存布局)需要在这个类编译完成的时候就被完全确定。
所以,由以上的矛盾可知,C++的member function不能既是template又是virtual。
变量作为数组长度
在栈上为什么不能用变量做数据的长度,在堆上可以吗?
—堆上可以,栈上不可以,栈上的地址空间只有在发生函数调用的时候才可以通过ebp指针来确定地址,堆上可以直接确定地址,可以直接寻址。
C++:构造函数和析构函数能否为虚函数?
构造函数不能为虚函数
C++对象在三个地方构建:
(1):函数堆栈;(2):自由存储区,或称之为堆;(3):静态存储区;无论在哪儿构建,其过程都是两步:
- 分配一块内存
- 调用构造函数
如果构造函数是虚函数,那么就需要通过vtable来调用,但此时面对的是一块raw memory,到哪里去找vtable呢?毕竟vtable是在构造函数中才初始化的,而不是在其之前,因此构造函数不能是虚函数;
析构函数可以是虚函数,且常常如此
因为此时vtable 已经初始化了,况且我们通常通过基类的指针来销毁对象,如果析构函数不为虚的话,就不能正确的识别类型,就不能正确的销毁对象;
- C/C++ 面试题总结
- c语言面试题总结
- c/c++面试题总结
- Linux C 面试题总结
- C/C++面试题总结
- 嵌入式C面试题总结
- 面试题总结 - C 语言 - 指针
- 面试题总结 - C 语言 - 预处理(preprocessor)
- 面试题总结 - C 语言 - 关键字(keywords)
- 面试题总结 - C 语言 - 函数(function)
- 嵌入式开发C语言面试题总结
- 嵌入式开发C语言面试题总结 .
- c面试题总结(含答案)
- 面试题总结 - C 语言 - 数据声明(data declaration)
- 面试题总结 - C 语言 - 位操作(bit operation)
- linux C/C++服务器后台开发面试题总结
- linux C/C++服务器后台开发面试题总结
- 嵌入式面试题总结-C语言知识点相关
- 使用sublimeCodeIntel插件导致input标签不能闭合
- Makefile中三个自动变量$^,$@,$<
- eclipse导出到androidstudio .9png图片报错问题解决(转自网友)
- 给初学者的RxJava2.0教程(七)
- wait 和 sleep
- C++面试题总结
- 图像处理大牛博客
- Linux下Oracle数据库表结构以及数据导入导出
- 癌症形成原因
- sublime text设置html的浏览器预览
- MyEclipse 2016 反编译插件安装
- win7_64+GeForce GTX750Ti + Anaaonda3 4.4+tensorflow1.2+cuda8.0+cuDNN5.1安装记
- 给初学者的RxJava2.0教程(八)
- 如何解决SVN目录的cleanup问题和lock问题