1.什么是多态?在该文章中解释并给出了代码例子
2.什么是重载、重写(覆盖)、重定义(隐藏)?
重载:
a.两个函数在同一作用域
b.函数名、参数相同
重写:
a.两个函数分别在基类和派生类的作用域
b.函数名、参数、返回值都必须相同(有例外:协变)
c.两个函数必须是虚函数
重定义:
a.两个函数分别在基类和派生类的作用域
b.函数名相同
c.两个基类和派生类的同名函数不构成重写就是重定义
3.多态的实现原理?
C++复习04
4.inline函数可以是虚函数吗?
不能,因为inline函数没有地址,无法把地址放到虚函数表中。
5.静态成员可以是虚函数吗?
不能,因为静态成员函数没有this指针,使用类型::成员函数的调用方式。无法访问虚函数表,所以静态成员函数无法放进虚函数表。
6.构造函数可以是虚函数吗?
不能,因为对象中的虚函数表指针是在构造函数初始化列表阶段才初始化的。
7.析构函数可以是虚函数吗?什么场景下析构函数是虚函数?
可以。在实现多态时。
当一个类被作为基类并且该基类对派生类的对象进行操作,在析构时防止只析构基类而不析构派生类的状况发生。把基类的析构函数设计为虚函数可以在基类的指针指向派生类对象时,用基类的指针删除派生类对象,避免内存泄漏。
8.对象访问普通函数快还是虚函数更快?
首先如果是普通对象,是一样快的。如果是指针对象或者是引用对象,则调用的普通函数快,因为构成多态,运行时调用虚函数需要到虚函数表中去查找。
9.虚函数表是在什么阶段生成的,存在哪的?
虚函数是在编译阶段就生成的,一般情况下存在代码段(常量区)的。
10.什么是抽象类?抽象类的作用?
包含纯虚函数的类叫做抽象类。抽象类不能实例化出对象。抽象类强制重写了虚函数,另外抽象类体现出了接口继承关系。
11.继承和组合的区别?
组合是通过对现有对象进行拼装即组合产生新的具有更复杂的功能。
继承 | 组合 |
---|---|
is-a | has-a |
隐式获得父类对象 | 显式获得父类对象 |
编译期决定 | 运行期决定 |
父类和子类之间的一种紧耦合关系 | 组合类和被包含类之间的一种松耦合关系 |
父类的所有方法和变量都被子类无条件继承,子类不能选择 | 在组合类中包含了外部类的对象,组合类可以选择调用外部类的方法 |