当前位置: 首页 > news >正文

【C++学习笔记】深入理解虚函数和多态

在这里插入图片描述


文章目录

  • 1. 基本概念
    • 1.1 虚函数
    • 1.2 虚函数表
    • 1.3 虚函数表指针
    • 1.4 虚函数表在支持多态方面的工作原理
  • 2. 类对象在内存中的布局
  • 参考

1. 基本概念

1.1 虚函数

类的成员函数,并不占用类对象的内存空间。

类中有虚函数,编译器会向类中插入一个看不见的成员变量,类似下面的伪代码:

class A
{public:void *vptr; //虚函数表指针(virtual table pointer)//......
};

这个看不见的成员变量,就叫虚函数表指针


1.2 虚函数表

虚函数表的生成时机:
在编译过程中,当类A中虚函数个数≥1个,编译器就会为类A生成一个虚函数表(virtual table),这个虚函数表会一直伴随着类A,编译完成,在程序执行的时候,也会被加载到内存中。


1.3 虚函数表指针

在这里插入图片描述


在这里插入图片描述


1.4 虚函数表在支持多态方面的工作原理

在这里插入图片描述

多态必须存在虚函数,没有虚函数,绝不可能存在多态

从代码实现上:
在这里插入图片描述


class Base
{public:virtual void myvirfunc(){}
};int main()
{Base*pa = new Base();pa->myvirfunc();//这是不是多态,是多态的Base base;base.myvirfunc();//这个就不是多态的Base* ybase = &base;ybase->myvirfunc();//这个也是多态
}

在这里插入图片描述


从表现形式上:

  1. 程序中既存在父类也存在子类,父类中必须含有虚函数,子类中也必须重写父类中的虚函数。
  2. 父类指针指向子类对象,或者父类引用绑定(指向)子类对象。
  3. 当通过父类的指针或引用,调用子类中重写的虚函数时,就能看出多态性的表现了。
class Derive:public Base
{
public:
virtual void myvirfunc(){}
}/父类指针指向子类对象
Derive derive;
Base*pbase =&derive;
pbase->myvirfunc();//Derive:myvirfunc()
/或者
Base*pbase2=new Derive();//释放内存请自行释放,在这里没演示
pbase2->myvirfunc();//Derive:myvirfunc()
//父类用绑定(指向)子类对象
Derive derive2;
Base&yinbase derive2;
yinbase.myvirfunc();//Derive:myvirfunc()

在这里插入图片描述


2. 类对象在内存中的布局

TBD.


参考

【1】C++ 多态
【2】C++ 一篇搞懂多态的实现原理
【3】C++ 多态 超详细讲解
【4】[C++]:万字超详细讲解多态以及多态的实现原理(面试的必考的c++考点)
【5】CPU眼里的:多态
【6】C++语言面试中,如何深入理解虚函数和多态?
【7】侯捷谈虚函数与多态(上)
【8】侯捷谈虚函数与多态(下)

http://www.xdnf.cn/news/248743.html

相关文章:

  • 简单句练习--语法基础
  • 50、【OS】【Nuttx】【OSTest】参数解析:函数定义
  • 当算力遇上堵车:AI如何让城市血管不再“血栓”?
  • OpenStack Yoga版安装笔记(25)Nova Cell理解
  • 黑马Java基础笔记-6
  • 伽利略如何测量光速?一场跨越山头的失败实验
  • VBA数据结构深度解析:基础类型、自定义类型与数组操作指南
  • Dagster资产工厂实战:从Python到YAML配置的高效ETL流程
  • 408真题笔记
  • 第十三章:LLM 应用质量保证:评估体系、工具与实战
  • 深入解析三大查找算法:线性查找、二分查找与哈希查找的原理与应用
  • 进程(Process)和操作系统(Operation System)
  • ctfshow web入门 web46
  • 用spring-boot-maven-plugin打包成单个jar有哪些缺点优化方案
  • pandas读取Excel数据(.xlsx和.xls)到treeview
  • JavaScript如何实现类型判断?
  • C语言 指针(2)
  • spring-cloud-alibaba最新版本聚合项目创建
  • 机器学习Day15 LightGBM算法
  • 探秘数据结构:构建高效算法的灵魂密码
  • GD32F407单片机开发入门(二十二)红外避障传感器模块实战含源码
  • 项目经验不够被拒3次?
  • 电流测量 I/V转换
  • 前端vue3项目学习
  • python3基础
  • 数位 DP 的关键
  • ProCCD:复古CCD相机应用,重现经典胶片感
  • 2025年五一杯数学建模竞赛赛题浅析-助攻快速选题
  • 深入探讨宾馆一次性牙刷价格,市场价格区间差异大
  • esp32cam开发板的引脚使用和测试