1.什么是多态? 就是不同的对象去完成不同的行为,就会产生不同的结果。 2.重载,重写(覆盖),重定义(隐藏)的区别? 重载:(1)在同一作用域; (2)只要函数名相同,参数不同的两个函数就构成重载; 重写(覆盖): (1)两个函数分别在基类和派生类的作用域; (2)函数的返回值/函数名/参数/ 都必须相同; (协变也是重写的一种)返回值可以不同,但返回值必须是基类或派生类的引用或指针; (3)函数必须是虚函数,为了实现多态; 重定义(隐藏): (1)两个函数分别在基类和派生类的作用域; (2)只要函数名相同即可; 3.多态的实现原理? 虚函数表; 单重继承:派生类先继承基类的虚函数表,再将重写的函数一覆盖,最后将自己的虚函数放在虚表的后边。 多重继承:派生类就会有各个基类的虚表,将重写的函数覆盖到各个基类的对应函数上,最后将自己的虚函数放在第一个虚表的后边。 4. inline函数可以是虚函数吗? 不能,因为inline函数没有地址(直接在调用的地方展开),无法把地址放到虚函数表中。 5.静态成员可以是虚函数吗? 不能,因为静态成员没有this指针,无法访问类的虚函数表。 6.构造函数可以是虚函数吗? 不能,因为对象中的虚函数表指针是在构造函数初始化列表阶段才进行初始化的。 7.析构函数可以是虚函数吗? 最好将基类的析构函数定义为虚函数,因为在编译的时候,编译器会把所有的析构函数名称统一处理成destructor,就直接构成了重写,在析构对象的时候,就可以多态的完成析构,避免了内存泄漏的问题。 8.虚函数表是在啥时候生成的,存在哪? 在编译阶段就会生成,所有对象共享该表,存在只读的数据段中。 9.虚拟继承和虚函数? 虚拟继承是解决派生类中的数据冗余和二义性问题(菱形继承); 虚函数的目的是实现多态, (1)调用函数的对象必须是指针或引用; (2)被调函数必须是虚函数,且完成了重写。 10.什么是抽象类,抽象类的作用? 包含纯虚函数的类叫抽象类,例如: virtual void test() = 0; 特点:且抽象类不能实例化出对象,其派生类也不行,只有重写纯虚函数,派生类才能实例化出对象。 作用:强制重写纯虚函数,体现了接口继承。 c++11中的两个关键字 final 修饰的虚函数不可以被重写; override 修饰派生类虚函数强制重写,否则编译不通过。