C++:多态和虚函数

本文详细介绍了C++中的多态性,重点讨论了虚函数的概念、作用和实现原理。通过实例展示了虚函数如何实现动态联编,以及虚函数在析构函数中的应用。还探讨了纯虚函数、抽象类、虚继承等相关概念,揭示了它们在多态编程中的重要性。
摘要由CSDN通过智能技术生成

多态

即同一接口,不同形态(函数名相同,参数不同,调用的函数不同,展示的形态不同)

  1. 静多态(早绑定/联编 静态绑定/联编)

(编译阶段确定函数的调用 函数重载 模板)

  1. 动多态(晚绑定/联编 动态绑定/联编)

(运行阶段确定函数的调用 虚函数机制)

  1. 宏多态

(预编译阶段确定函数的调用)不建议使用 高级宏:内联函数

联编

程序调用函数时,将使用哪个可执行代码块?编译器负责回答这个问题。将源代码中的函数调用解释为执行特定的函数代码块,被称为函数联编。

在编译过程中进行联编称为静态联编(static binding),又称静态绑定。然而,虚函数的存在使得这项工作变得更加困难,使用哪一个函数是不能在编译时期确定的,因为编译器不知道用户将选择哪种类型的对象。所以,编译器必须能够在程序运行时选择正确的虚函数的代码,这称为动态联编/绑定。

虚函数

什么是虚函数(virtual)

即函数名前加了virtue关键字的函数

  • virtual放在函数的返回值前面,用于表示该成员方法为虚方法
  • 基类(父类)虚函数前必须写;子类可以省略。
  • virtual只能出现在类内部而不能用于类外部的函数定义

为什么设计虚函数

  • 我们知道派生类会拥有基类的定义的函数,但是如果对于某些函数,我们希望派生类各自定义适合派生类自己的版本的函数,于是基类就可将此函数定义为虚函数,让派生类各自实现自己功能版本的函数为动多态提供支持

举例

Base *base; // 定义基类指针
Derive derive; // 定义派生类对象
base = &derive; // 基类指针指向派生类对象
base->function();

在这里插入图片描述
在这里插入图片描述

结果证明:那么如果在基类中没有将function()声明为虚的(virtual),那么base->function()将根据指针类型(Base *)调用Base::function()指针类型在编译时已知因此编译器在编译时,直接将function()关联到Base::function()总之,编译器对非虚方法使用静态联编

而使用虚方法之后:

在这里插入图片描述

在这里插入图片描述

结果证明如果在基类中将function()声明为虚的则base->function()将根据对象类型(Derive)调用Derive::function()对象类型为Derive,但通常只有在程序运行时才能确定对象的类型。所以编译器生成的代码将在程序执行时,根据对象类型将function()关联到Derive::function()或Base::function()总之,编译器

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值