C++多态讲解以及常见面试题

多态的概念

什么是多态
​ 多态就是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。

实现多态的条件
  1. 动态绑定多态(在运行时才知道函数的地址):

调用函数的对象是指针或引用。
被调用函数必须是虚函数,并且完成了虚函数的重写。

  1. 静态绑定多态(在编译时确定函数的地址):

函数重载

多态的作用

  封装是为了代码模块化,继承是扩展已存在的代码,他们的目的都是为了 实现代码的复用,但是多态的目的是为了实现接口的重用,也就是多不管传递过来的是哪个类对象,函数都能狗狗通过这个接口调用到适应自己对象的实现方法。
  虚函数重写:子类重写父类的函数(协变:子类中的返回值和父类中的返回值是父子关系,并且是引用或指针)。如果只在父类中添加virtual关键字,子类中的重写函数也会称为虚函数,童谣可以构成多态,否则为重定义。

函数重载、重定义、重写的区别:
  1. 函数的重载:在相同的作用域中,两个函数的参数不同,函数名相同,构成函数重载。
  2. 函数重定义:子类中有父类的同名函数,继承自父类的函数被隐藏,子类调用重写后的。
  3. 函数的重写:子类与父类的虚函数函数名、参数、返回值相同的函数,构成函数重写。
虚函数和纯虚函数

  虚函数就是在类的成员函数钱钱添加了virtual关键字。主要是为了实现多态,通过一张虚函数表来实现。它允许子类重写来自父类的成员函数。
  纯虚函数就是在基类中只对对应的虚函数进行声明,在最后加=0,定义纯虚函数的类是一个抽象类,抽象类不能被实例化,它体现的是接口继承,子类只是继承了这个接口的形式,不需要使用他里面的功能,要实现自己的功能。在子类中必须实现父类的纯虚函数,如果不实现父类的纯虚函数,这个子类也是一个抽象类,同样不能区实例化对象。
  那么什么是抽象类呢?抽象类就是包含纯虚函数的类,这个类不能被实例化,因为类定义的不完整,成员函数都没有实现,这种类只是为了接口继承的实现,继承他的子类并不想去用它,子类要实现自己的功能。
  无论是虚函数还是纯虚函数,都是在基类中为派生类提供编程接口,面向对象最核心的思想就是对接口编程,而不是对实现编程,在C++中,就是使用继承和多态来事项这种思想。如果想让基类为派生类提供缺省的处理方法,那么就将这个函数设为虚函数,如果是想让派生类必须重写该虚函数,就将这个函数设为纯虚函数。

1、虚函数和纯虚函数可以定义在同一个类中,一旦某个类包含了纯虚函数,这个类就是一个抽象类。
2、虚函数可以直接被使用,但是纯虚函数必须要在派生类中实现之后才可以使用,一i那位纯虚函数在积累中只声明没有定义,所以无法直接使用。
3、虚函数和纯虚函数都可以在子了中被重写,一堕胎的形式被调用。
4、虚函数和纯虚函数都是为了实现接口继承而出现。
5、虚函数的定义:virtual + 函数纯虚函数定义:virtual + 函数 + =0;
6、虚函数和纯虚函数都不能设为static,因为static在编译的时候就要被绑定,但是虚函数和纯虚函数实在运行时在确定的。

虚函数表

  虚函数表是一个函数指针数组,在末尾存放的时一个空指针nullptr,在VS中存放在代码段,在虚函数表中只存放虚函数执政,他不存放普通函数的指针,将新创建的虚函数指针存放在虚函数表末尾。
  虚标指针:存放在对象模型中,在32位机上,存放在对象模型的头4个字节中。

单继承中的虚表

  在单继承中所有的虚函数都存放在虚表中,如果有被重写的,直接将虚表中的虚函数指针换成重写后的虚函数指针即可,如果在子类中的添加了新的虚函数,按照新的虚函数的声明顺序将其添加到虚表中。在虚表中,先添加父类的虚函数指针,再添加子类的虚函数指针。

多继承中的虚表
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值