C++多态基础知识

本文介绍了C++中的多态概念,包括赋值兼容、多态成立的条件、静态与动态联编、虚析构函数的作用。重点讨论了多态的实现原理,如虚函数表和vptr指针,以及它们如何支持运行时的多态性。同时,解释了重载、重写和重定义的区别,并探讨了指针步长和vptr指针存在的证明。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

多态

C++中所谓的多态(polymorphism)是指,由继承而产生的相关的不同的类,其对象对 同一消息 会作出不同的响应。

多态性是面向对象程序设计的一个重要特征,能增加程序的灵活性。可以减轻系统 升级,维护,调试的工作量和复杂度.

C++中通过virtual关键字对多态进行支持
使用virtual声明的函数被重写后即可展现多态特性 
在这里插入图片描述
在这里插入图片描述

赋值兼容(多态实现的前提)

赋值兼容规则是指在需要基类对象的任何地方都可以使用公有派生类的 对象来替代
赋值兼容是一种默认行为,不需要任何的显示的转化步骤。
赋值兼容规则中所指的替代包括以下的情况: 

︎派生类的对象可以赋值给基类对象。  ︎
派生类的对象可以初始化基类的引用。     ︎
派生类对象的地址可以赋给指向基类的指针。  

在替代之后,派生类对象就可以作为基类的对象使用,但只能使用从基类继承的成员。 

多态成立的条件

在这里插入图片描述

多态是设计模式的基础,多态是框架的基础

静态联编和动态联编

1、联编是指一个程序模块、代码之间互相关联的过程。 
2、静态联编(static binding)是程序的匹配、连接在编译阶段实现,也称为 早期匹配。重载函数使用静态联编 (编译时)
3、动态联编是指程序联编推迟到运行时进行,所以又称为 晚期联编(迟绑定)。switch语句和 if语句是动态联编的例子(程序执行时)
在这里插入图片描述

虚析构函数

构造函数不能是虚函数。建立一个派生类对象时,必须从类层次的根开始,沿着继承路径逐个调用基类的构造函数。

析构函数可以是虚的。虚析构函数用于指引delete运算符正确析构动态对象

重载、重写、重定义

重载(添加):同一个类,函数名相同,函数参数列表不同(参数类型,参数个数,参数顺序)
重写(覆盖):不同类(基类与派生类),函数名相同,参数相同,基类必须有virtual
重定义(隐藏):不同类(基类与派生类),函数名相同,
参数不同,不管基类有无virtual,基类的函数被隐藏
参数相同,但基类没有virtual,基类的函数被隐藏

多态的实现原理

虚函数表和vptr指针

C++编译器提前布局,在类对象中增加vptr指针,虚函数入口地址存虚函数表
C++编译器并不是区分子类对象和父类对象,而是根据对象指针找 vptr指针,再找虚函数入口,实现迟绑定,支持了多态
在这里插入图片描述
在这里插入图片描述
如果调用一个普通函数,编译器根本就不会查找虚函数表
当调用了虚函数,编译器才会查找虚函数表
在这里插入图片描述

在这里插入图片描述
vptr指针式分步初始化的
在这里插入图片描述
在这里插入图片描述

指针步长

父类指针和子类指针的步长
在这里插入图片描述

证明vptr指针的存在

检测类的大小就可以发现
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值