C++继承和多态常见面试题

1 什么是多态

不同的对象去完成某个行为时会产生不同的状态
例如:买票这个行为,当普通人买票时,是全价买票;学生买票时,是半价买票;军人买票时,是优先买票。都是进行买票这个行为,但是三类人会产生不同的状态。

2 什么是重载、重写(覆盖)、重定义(隐藏)

重载

1 两个函数在同一个作用域
2 函数名相同,形参列表不同(参数个数或类型或类型顺序)

重写(覆盖)

1 两个函数分别在基类和派生类的作用域
2 函数名,参数,返回值都必须相同(协变例外)
3 两个函数必须是虚函数

重定义(隐藏)

1 两个函数分别在基类和派生类的作用域
2 函数名相同
3 基类和派生类的同名函数不构成重写就是重定义

3 多态的实现原理

符合多态的两个条件(1 虚函数重写 2 父类指针或者引用去调用虚函数),那么调用时会到指向对象的虚表中找到对应的虚函数地址,进行调用。

4 inline函数可以是虚函数吗

可以,但inline只是一个建议,当一个函数是虚函数以后,多态调用中,inline就失效了。

5 static函数可以是虚函数吗

不可以,没有this指针,可以直接使用。虚函数是为了实现多态,多态都是运行时去虚表中决议,static成员函数都是在编译时决议。

6 构造函数可以是虚函数吗

不可以,virtual函数是为了实现多态,运行时去虚表找对应虚函数进行调用,对象中虚表指针都是构造函数初始化列表阶段才初始化的。

7 析构函数可以是虚函数吗?

可以,建议基类的构造函数定义为虚函数

8 拷贝构造和赋值重载可以是虚函数吗

拷贝构造不可以,拷贝构造也是构造函数
赋值重载可以

9 对象访问普通函数快还是虚函数快

虚函数不构成多态调用,一样快
虚函数构成多态调用,普通函数快,因为多态调用是运行时去虚表中找虚函数的地址

10 虚函数是在什么阶段生成的,存在哪

编译阶段就生成好的,存在代码段(常量区)

11 C++菱形继承的问题 虚继承的原理

在这里插入图片描述

在这里插入图片描述

菱形继承的问题:从下面的对象成员模型构造,可以看出菱形继承有数据冗余和二义性的问题。在Assistant的对象中Person成员会有两份。

虚拟继承可以解决菱形继承的二义性和数据冗余的问题
原理:可以看出对象中将A放到的了对象组成的最下面,这个A同时属于B和C,那么B和C如何去找到公共的A呢?这里是通过了B和C的两个指针,指向的一张表。这两个指针叫虚基表指针,这两个表叫虚基表。虚基表中存的偏移量。通过偏移量可以找到下面的A。
在这里插入图片描述

12 什么是抽象类,抽象类的作用

在虚函数的后面写上 =0 ,则这个函数为纯虚函数。包含纯虚函数的类叫做抽象类(也叫接口类),抽象类不能实例化出对象。派生类继承后也不能实例化出对象,只有重写纯虚函数,派生类才能实例化出对象。

作用 纯虚函数规范了派生类必须重写,另外纯虚函数更体现出了接口继承。

13 继承和组合的区别 什么时候用继承 什么时候用组合

public继承是一种is-a的关系。也就是说每个派生类对象都是一个基类对象。(人-学生;植物-玫瑰花)
组合是一种has-a的关系。假设B组合了A,每个B对象中都有一个A对象。(轮胎-车)
实际尽量多去用组合。组合的耦合度低,代码维护性好。
但有些关系就适合继承那就用继承,另外要实现多态,也必须要继承。
类之间的关系既可以用继承,也可以用组合,优先使用对象组合。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值