面试题总结——第3篇 构造/析构虚函数 多态原理 接口/抽象类

7.构造函数和析构函数可以声明为虚函数嘛?

构造函数不能声明为析构函数:虚函数的意思就是开启动态绑定,程序会根据动态类型来选择调用的方法,而如果将构造函数声明为虚函数,那我们将无法确认对象继而进行动态绑定,换句话说就是说无法实现构造,那么虚函数的虚表就无法构建

析构函数可以声明为虚函数:在类的继承中,如果基类指针指向派生类,那么用基类指针delete时,如果不定义虚函数,派生类中的派生部分将无法进行析构

8.多态实现的原理

首先多态实现必须依赖于两个条件:1)子类重写父类的虚函数 2)必须通过基类的指针或者引用来调用虚函数

实现多态的机制是通过虚函数表(函数指针的指针数组)来实现的,虚表的最后是一个nullptr

虚表的构建过程:1)子类拷贝父类的虚表 2)进行重写过的函数指针进行相同偏移量位置的替换 3)将新增的虚函数添加在虚表结尾 key:多继承未重写的虚函数放在第一个继承基类部分的虚函数表中

9.抽象类和接口的区别

抽象类是不能实例化的类,接口是一组方法集合

抽象类是本体的抽象,接口是行为的抽象

1>接口不含成员变量,抽象类可以有

2>接口全是纯虚函数,抽象类可以有普通函数

3>接口全是public,抽象类可以有其他权限

4>接口支持多继承,抽象类仅支持单继承

5>接口不能存在static方法,抽象类可以

6>继承抽象类可以不进行重写,而接口必须重写

猜你喜欢

转载自blog.csdn.net/ladykiller21/article/details/89029016