必要条件:
1. 一个基类的指针或者引用指向派生类的对象;2.虚函数
36. 多重继承有什么问题? 怎样消除多重继承中的二义性?
1)增加程序的复杂度 , 使程序的编写和维护比较困难 , 容易出错;
2)继承类和基类的同名函数产生了二义性 , 同名函数不知道调用基类还是继承类 , C++中使用虚函数解决这个问题
3)继承过程中可能会继承一些不必要的数据 , 对于多级继承 , 可能会产生数据很长
可以使用成员限定符和虚函数解决多重继承中函数的二义性问题 。
37.求两个数的乘积和商数 , 该作用由宏定义来实现
#define product(a,b) ((a)*(b))
#define divide(a,b) ((a)/(b))
38.什么叫静态关联 , 什么叫动态关联
多态中 , 静态关联是程序在编译阶段就能确定实际执行动作 , 程序运行才能确定叫动态关联
39.什么叫智能指针?常用的智能指针有哪些?智能指针的实现?
智能指针是一个存储指向动态分配(堆)对象指针的类 , 构造函数传入普通指针 , 析构函数释放指针 。栈上分配 , 函数或程序结束自动释放 , 防止内存泄露 。使用引用计数器 , 类与指向的对象相关联 , 引用计数跟踪该类有多少个对象共享同一指针 。创建类的新对象时 , 初始化指针并将引用计数置为1;当对象作为另一对象的副本而创建 , 增加引用计数;对一个对象进行赋值时 , 减少引用计数 , 并增加右操作数所指对象的引用计数;调用析构函数时 , 构造函数减少引用计数 , 当引用计数减至0 , 则删除基础对象 。
std::auto_ptr , 不支持复制(拷贝构造函数)和赋值(operator =) , 编译不会提示出错 。
C++11引入的unique_ptr , 也不支持复制和赋值 , 但比auto_ptr好 , 直接赋值会编译出错 。
C++11或boost的shared_ptr , 基于引用计数的智能指针 。可随意赋值 , 直到内存的引用计数为0的时候这个内存会被释放 。还有Weak_ptr
40.枚举与#define 宏的区别
1)#define 宏常量是在预编译阶段进行简单替换 。枚举常量则是在编译的时候确定其值 。
2)可以调试枚举常量 , 但是不能调试宏常量 。
3)枚举可以一次定义大量相关的常量 , 而#define 宏一次只能定义一个 。
41.介绍一下函数的重载
重载是在不同类型上作不同运算而又用同样的名字的函数 。重载函数至少在参数个数 , 参数类型 , 或参数顺序上有所不同 。
42.派生新类的过程要经历三个步骤
1.吸收基类成员 2.改造基类成员 3.添加新成员
43.面向对象的三个基本特征 , 并简单叙述之?
1)封装:将客观事物抽象成类 , 每个类对自身的数据和方法实行2)继承3)多态:允许一个基类的指针或引用指向一个派生类对象
44.多态性体现都有哪些?动态绑定怎么实现?
多态性是一个接口,多种实现 , 是面向对象的核心 。编译时多态性:通过重载函数实现 。运行时多态性:通过虚函数实现,结合动态绑定 。
45.虚函数 , 虚函数表里面内存如何分配?
编译时若基类中有虚函数 , 编译器为该的类创建一个一维数组的虚表 , 存放是每个虚函数的地址 。基类和派生类都包含虚函数时 , 这两个类都建立一个虚表 。构造函数中进行虚表的创建和虚表指针的初始化 。在构造子类对象时 , 要先调用父类的构造函数 , 初始化父类对象的虚表指针 , 该虚表指针指向父类的虚表 。执行子类的构造函数时 , 子类对象的虚表指针被初始化 , 指向自身的虚表 。每一个类都有虚表 。虚表可以继承 , 如果子类没有重写虚函数 , 那么子类虚表中仍然会有该函数的地址 , 只不过这个地址指向的是基类的虚函数实现 。派生类的虚表中虚函数地址的排列顺序和基类的虚表中虚函数地址排列顺序相同 。当用一个指针/引用调用一个函数的时候 , 被调用的函数是取决于这个指针/引用的类型 。即如果这个指针/引用是基类对象的指针/引用就调用基类的方法;如果指针/引用是派生类对象的指针/引用就调用派生类的方法 , 当然如果派生类中没有此方法 , 就会向上到基类里面去寻找相应的方法 。这些调用在编译阶段就确定了 。当涉及到多态性的时候 , 采用了虚函数和动态绑定 , 此时的调用就不会在编译时候确定而是在运行时确定 。不在单独考虑指针/引用的类型而是看指针/引用的对象的类型来判断函数的调用 , 根据对象中虚指针指向的虚表中的函数的地址来确定调用哪个函数 。
推荐阅读
- 如何选购普洱熟茶,如何鉴别普洱熟茶的好坏
- 男人该如何健身比较好?
- 如何正确慢跑呢?
- 如何轻松跑步呢?
- 胸肌中缝应该如何锻炼?
- 腰部赘肉应该如何减掉呢?
- 腰后的赘肉应该如何减掉呢?
- 基础力量应该如何训练?
- 如何收藏普洱茶,普洱茶收藏和存放需注意哪些
- 如何报考高等教育自学考试课程