7.构造函数和析构函数可以声明为虚函数嘛?
构造函数不能声明为析构函数:虚函数的意思就是开启动态绑定,程序会根据动态类型来选择调用的方法,而如果将构造函数声明为虚函数,那我们将无法确认对象继而进行动态绑定,换句话说就是说无法实现构造,那么虚函数的虚表就无法构建
析构函数可以声明为虚函数:在类的继承中,如果基类指针指向派生类,那么用基类指针delete时,如果不定义虚函数,派生类中的派生部分将无法进行析构
8.多态实现的原理
首先多态实现必须依赖于两个条件:1)子类重写父类的虚函数 2)必须通过基类的指针或者引用来调用虚函数
实现多态的机制是通过虚函数表(函数指针的指针数组)来实现的,虚表的最后是一个nullptr
虚表的构建过程:1)子类拷贝父类的虚表 2)进行重写过的函数指针进行相同偏移量位置的替换 3)将新增的虚函数添加在虚表结尾 key:多继承未重写的虚函数放在第一个继承基类部分的虚函数表中
9.抽象类和接口的区别
抽象类是不能实例化的类,接口是一组方法集合
抽象类是本体的抽象,接口是行为的抽象
1>接口不含成员变量,抽象类可以有
2>接口全是纯虚函数,抽象类可以有普通函数
3>接口全是public,抽象类可以有其他权限
4>接口支持多继承,抽象类仅支持单继承
5>接口不能存在static方法,抽象类可以
6>继承抽象类可以不进行重写,而接口必须重写