目录
1. 多态性都有哪些?动态绑定怎么实现? 3
2. 虚函数,虚函数表里面内存如何分配? 3
3. 纯虚函数如何定义,为什么析构函数要定义成虚函数? 4
4. C++中哪些不能是虚函数? 4
5. 类型转换有哪些? (参考) 4
6. 为什么要用static_cast转换而不用c语言中的转换? 4
7. 操作符重载(+操作符),具体如何去定义? 5
8. 内存对齐的原则? 5
9. 内联函数与宏定义的区别? 5
10. 关键字static、extern、const、typedef 5
11. C++中调用被C编译器编译后的函数,为什么加extern “C”? 5
12. 如何实现只能动态分配类对象,不能定义类对象?参考 6
13. explicit是干什么用的 6
14. 内存溢出有那些因素? 7
15. new与malloc的区别,delet和free的区别?参考 7
16. 必须使用【初始化列表】初始化数据成员的情况 8
17. C++引用和指针的区别? 8
18. 说说栈区和堆区和静态存储区?参考 8
19. auto_ptr类,C++智能指针的实现? 9
20. 迭代器删除元素的会发生什么? 迭代器失效?未完 9
21. 内存溢出有那些因素?未完 10
22. 模版怎么实现???未完 10
23. 模版特化的概念,为什么特化?????未完 10
24. 静态成员函数和数据成员有什么意义?????未完 10
25. 异常机制是怎么回事? 11
26. 最近的一个项目,技术难点啊,怎么克服的? 11
27. ===============操作系统相关=================== 11
28. linux进程、线程总结?参考 11
29. 线程同步方式 12
30. 进程通信方式? 13
31. 产生死锁的四个条件,以及它们的处理方法? 未完 13
32. IO多路复用有epoll, poll, select?Linux网络编程,不熟悉 13
33. Linux常用命令? 《鸟哥Linux私房菜》 14
34. 哈希表?笔记本问题25 14
35. 数据库事务? 14
36. ================数据结构和算法================= 14
37. 查找数组中第k大的数字?Offer的30题。 14
38. 排序算法有哪些?快速排序实现?最好时间复杂度,平均时间复杂度? 15
39. strcpy函数的编写? strcpy返回类型是干嘛用的? 15
40. STL有哪些容器,对比vector和set? 15
41. 红黑树的定义和解释?B树,B+树的基本性质? 15
42. ==============网络以及其它==================== 15
43. 常见的加密算法? 15
44. https? 15
1. 多态性都有哪些?动态绑定怎么实现?
多态性是一个接口,多种实现,是面向对象的核心。 编译时多态性:通过重载函数实现。运行时多态性:通过虚函数实现,结合动态绑定。
通过基类的引用或指针调用虚函数时,发生动态绑定。引用(或指针)既可以指向基类对象也可以指向派生类对象,这一事实是动态绑定的关键。
动态绑定是通过虚函数实现的。而虚函数是通过一张虚函数表实现的。
用virtual关键字申明的函数叫做虚函数,虚函数肯定是类的成员函数。
存在虚函数的类都有一个一维的虚函数表叫做虚表。类的对象有一个指向虚表开始的虚指针。虚表是和类对应的,虚表指针是和对象对应的。
2. 虚函数,虚函数表里面内存如何分配?
编译器在编译的时候,发现animal类中有虚函数,此时编译器会为每个包含虚函数的类创建一个虚表,该表是个一维数组,数组中存放每个虚函数的地址。animal和fish类都包含了一个虚函数breathe(),因此编译器会为这两个类都建立一个虚表。
那么虚表指针在什么时候,或者说在什么地方初始化呢?
答案是在构造函数中进行虚表的创建和虚表指针的初始化。还记得构造函数的调用顺序吗,在构造子类对象时,要先调用父类的构造函数,此时编译器只“看到了”父类,并不知道后面是否后还有继承者,它初始化父类对象的虚表指针,该虚表指针指向父类的虚表。当执行子类的构造函数时,子类对象的虚表指针被初始化,指向自身的虚表。
总结(基类有虚函数):
1. 每一个类都有虚表。
2. 虚表可以继承,如果子类没有重写虚函数,那么子类虚表中仍然会有该函数的地址,只不过这个地址指向的是基类的虚函数实现。如果基类有3个虚函数,那么基类的虚表中就有三项(虚函数地址),派生类也会有虚表,至少有三项,如果重写了相应的虚函数,那么虚表中的地址就会改变,指向自身的虚函数实现。如果派生类有自己的虚函数,那么虚表中就会添加该项。
3. 派生类的虚表中虚函数地址的排列顺序和基类的虚表中虚函数地址排列顺序相同。
一般情况下,当我们用一个指针/引用调用一个函数的时候,被调用的函数是取决于这个指针/引用的类型。即如果这个指针/引用是基类对象的指针/引用就调用基类的方法;如果指针/引用是派生类对象的指针/引用就调用派生类的方法,当然如果派生类中没有此方法,就会向上到基类里面去寻找相应的方法。这些调用在编译阶段就确定了。当涉及到多态性的时候,采用了虚函数和动态绑定,此时的调用就不会在编译时候确定而是在运行时确定。不在单独考虑指针/引用的类型