如何理解c/c++和php语言的区别( 四 )


(2)继承差别
使用class保留字的派生类默认具有private继承 , 而用struct保留字定义的类某人具有public继承 。其它则没有任何区别 。
主要点就两个:默认的访问级别和默认的继承级别 class都是private
28.派生类与虚函数概述
(1) 派生类继承的函数不能定义为虚函数 。虚函数是希望派生类重新定义 。如果派生类没有重新定义某个虚函数 , 则在调用的时候会使用基类中定义的版本 。
(2)派生类中函数的声明必须与基类中定义的方式完全匹配 。
(3) 基类中声明为虚函数 , 则派生类也为虚函数 。
29. 虚函数与纯虚函数区别
1)虚函数在子类里面也可以不重载的;但纯虚必须在子类去实现
2)带纯虚函数的类叫虚基类也叫抽象类 , 这种基类不能直接生成对象 , 只能被继承 , 重写虚函数后才能使用 , 运行时动态动态绑定!
30.深拷贝与浅拷贝
浅拷贝:
char ori[]=“hello”;char *copy=ori;
深拷贝:
char ori[]="hello"; char *copy=new char[]; copy=ori;
浅拷贝只是对指针的拷贝 , 拷贝后两个指针指向同一个内存空间 , 深拷贝不但对指针进行拷贝 , 而且对指针指向的内容进行拷贝 , 经深拷贝后的指针是指向两个不同地址的指针 。
浅拷贝可能出现的问题:
1) 浅拷贝只是拷贝了指针 , 使得两个指针指向同一个地址 , 这样在对象块结束 , 调用函数析构的时 , 会造成同一份资源析构2次 , 即delete同一块内存2次 , 造成程序崩溃 。
2) 浅拷贝使得两个指针都指向同一块内存 , 任何一方的变动都会影响到另一方 。
3) 同一个空间 , 第二次释放失败 , 导致无法操作该空间 , 造成内存泄漏 。
31. stl各容器的实现原理(必考)
1) Vector顺序容器 , 是一个动态数组 , 支持随机插入、删除、查找等操作 , 在内存中是一块连续的空间 。在原有空间不够情况下自动分配空间 , 增加为原来的两倍 。vector随机存取效率高 , 但是在vector插入元素 , 需要移动的数目多 , 效率低下 。
注:vector动态增加大小时是以原大小的两倍另外配置一块较大的空间 , 然后将原内容拷贝过来 , 然后才开始在原内容之后构造新元素 , 并释放原空间 。因此 , 对vector空间重新配置 , 指向原vector的所有迭代器就都失效了 。
2) Map关联容器 , 以键值对的形式进行存储 , 方便进行查找 。关键词起到索引的作用 , 值则表示与索引相关联的数据 。红黑树的结构实现 , 插入删除等操作都在O(logn)时间内完成 。
3) Set是关联容器 , set每个元素只包含一个关键字 。set支持高效的关键字检查是否在set中 。set也是以红黑树的结构实现 , 支持高效插入、删除等操作 。
32.哪些库函数属于高危函数 , 为什么?
strcpy 赋值到目标区间可能会造成缓冲区溢出!
33.STL有7种主要容器:vector,list,deque,map,multimap,set,multiset
34.你如何理解MVC 。简单举例来说明其应用 。
MVC模式是observer 模式的一个特例,现在很多都是JAVA的一些框架 , MFC的 , PHP的 。
35.C++特点是什么 , 多态实现机制?(面试问过)多态作用?两个必要条件?
C++中多态机制主要体现在两个方面 , 一个是函数的重载 , 一个是接口的重写 。接口多态指的是“一个接口多种形态” 。每一个对象内部都有一个虚表指针 , 该虚表指针被初始化为本类的虚表 。所以在程序中 , 不管你的对象类型如何转换 , 但该对象内部的虚表指针是固定的 , 所以呢 , 才能实现动态的对象函数调用 , 这就是C++多态性实现的原理 。
多态的基础是继承 , 需要虚函数的支持 , 简单的多态是很简单的 。子类继承父类大部分的资源 , 不能继承的有构造函数 , 析构函数 , 拷贝构造函数 , operator=函数 , 友元函数等等
作用:

  1. 隐藏实现细节 , 代码能够模块化;2. 接口重用:为了类在继承和派生的时候正确调用 。


    推荐阅读