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

c++ 黑马教程笔记//目录 (44条消息) C++(三十四)之全局友元函数//黑马教程_风请扬-优快云博客 阅读详情

在这里插入图片描述


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】侯捷谈虚函数与多态(下)

C++实验8报告多态性与虚函数 所使用的开发工具及环境: PC机一套 实验目的: (1)了解多态性的概念。 (2)了解虚函数的作用及使用方法。 (3)了解静态关联和动态关联的概念和川法。 (4)了解纯虚函数和抽象类的概念和用法。 实验内容: 1、分析程序运行结果,掌握虚函数的使用。 程序一: #include <iostream> using namespace std; class ONE { public: ... 阅读详情

相关推荐

深入理解C++中的继承、多态与虚函数机制

面向对象编程(OOP)是现代软件开发的核心范式之一,而C++作为一门经典的面向对象语言,其继承、多态和虚函数机制构成了OOP的三大支柱。本文将全面剖析这些核心概念,帮助开发者深入理解并正确运用这些强大的特性。

vvilkin的学习备忘 1502

【C++】深入理解C++虚函数与纯虚函数

虚函数是在基类中使用关键字virtual声明的成员函数,它允许派生类对其进行重写(Override),实现运行时多态。当通过基类指针或引用调用虚函数时,实际调用的是对象类型对应的派生类中的函数,这个过程称为动态绑定(Dynamic Binding)或晚绑定(Late Binding)。虚函数重写指的是派生类中提供一个函数版本,该版本与基类中具有相同名称、相同返回类型和相同参数列表的虚函数相匹配。通过这种方式,派生类可以提供自己特定的实现,替换或扩展基类的行为。

Colorful___的博客 2万+

多态——C++

多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。比如Student继承了Person。Person对象买票全价,Student对象买票半价。必须通过基类的指针或者引用调用虚函数被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写函数之间的关系。

Ll_R_lL的博客 1213

C++:深入理解多态

多态的概念:通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。

weixin_51142926的博客 4114

gesp c++ 八级知识点

gesp c++ 八级知识点

MMD.然大大 2237

CST高阶技巧:用周期性边界快速仿真共面波导色散特性(含JDM求解器优化)

本文详细介绍了在CST仿真软件中,利用周期性边界条件结合JDM本征模求解器,高效分析共面波导色散特性的高阶技巧。该方法通过仿真一个单元胞而非整条传输线,大幅提升计算效率,并提供了从建模、边界设置、求解器优化到后处理的完整工作流程,是高频电路设计的实用指南。

weixin_29280219的博客 402

C++_多态(深入理解虚函数表)

多态 多态的概念:通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。 比如买票这个行为,当普通人买票时,是全价买票;学生买票时,是半价买票;军人买票时是优先买票 怎么构成多态 并没有构成多态,形参p对象,全部调用了Person类的成员函数。 多态与重写 这时候就需要使用虚函数来构成多态。 梳理一下,多态的条件: 继承类中,需要对虚函数进行重写。 基类的指针或者引用都去调用这个虚函数 而重写的条件 3. 父子类中的函数都是虚函数。 4. 函数名参数返回值都要相

qq_45928272的博客 5395

BepInEx插件开发实战:用Visual Studio快速创建你的第一个Unity Mod(2024新版)

本文是2024年新版BepInEx插件开发实战指南,详细讲解如何使用Visual Studio快速创建你的第一个Unity Mod。内容涵盖专业开发环境搭建、插件生命周期解析、利用HarmonyX进行游戏代码注入、实现实时调试与热重载技巧,以及项目配置与打包发布全流程,助你从Mod使用者转变为创造者。

weixin_29002595的博客 340

【C++】第十六节—一文详解 | 多态(概念+定义+实现,纯虚函数和抽象类,原理)

本文详细介绍了C++中多态的概念、实现原理及相关技术要点。主要内容包括:多态分为编译时多态(静态多态)和运行时多态(动态多态),重点讲解了运行时多态的实现条件:必须通过基类指针或引用调用虚函数,且派生类必须完成虚函数重写。文章还深入分析了虚函数表指针、动态绑定机制、虚函数表的存储结构等底层原理,并通过多个代码示例演示了多态的具体应用场景。此外,还介绍了协变、析构函数重写、纯虚函数和抽象类等高级特性,以及C++11新增的override和final关键字的使用场景。

稻草人 1万+

STM32F103单片机驱动TM1637数码管显示模块

最近项目中需要用到数码管显示,于是买了一个TM1637芯片驱动的四位数码显示模块,现将调试过程记录一下,方便以后参考。 使用的单片机是STM32F103C8T6最小系统 使用的数码管模块是TM1637四位数码管显示模块 实际运行效果 下面先看一下TM1637和数码管连接的具体线路图 实际使用的模块没有带按键,只用了4个数码管,模块和单片机连接只需要4根线VCC、GND、CLK、DIO。芯片和单片机通信使用的是I2C总线,下面就来说一下如何...

HXYDJ的博客 1万+

msfvenom制作windows/linux/android/ios木马

msfvenom选项如下 -p, --payload<payload> 指定 payload(攻击荷载)。如果使用自定义payload,请使用'-'或者stdin指定。 -l, --list [module_typel列出指定模块的所有可用资源。模块类型包括:payloads, encoders, nops, all -n, --nopsled <length>为payload预先指定一个NOP滑动长度。 -f, --format <format>指定输出格式(使

Cwillchris的博客 2733

深入理解C++多态-虚函数

C++多态的实现方式可以分为静态多态和动态多态,其中静态多态主要有函数重装和模板两种方式,动态多态就是虚函数。

LeoLei8060的博客 1469

详解AUTOSAR:AUTOSAR架构中的配置文件(拓展篇—7)

查看AUTOSAR代码包时会发现一些这样格式的文件:xxx_PBcfg.c、xxx_Lcfg.c和xxx_Cfg.h,本篇博文讲一讲这几个配置文件的作用和特点。

不脱发的程序猿 2146

深入理解C++多态机制:虚函数、虚表与对象内存模型解析

本文深入探讨了C++多态的实现原理。多态通过虚函数机制实现"同一接口,不同行为",其核心在于虚函数表和动态绑定。文章详细分析了单继承、多继承及菱形继承下的虚函数表结构,比较了普通继承与虚继承的内存布局差异,并解释了虚基表指针的作用机制。通过买票案例展示了多态的实际应用,同时剖析了抽象类和纯虚函数的特性。最后,文章提供了查看虚函数表内容的实用方法,帮助读者直观理解多态在底层的实现方式。

2302_77620024的博客 2万+

2026马斯克《Moonshots》播客独家访谈全记录与深度解析

本次访谈是马斯克2026年首份重磅公开对话,录制于2025年12月22日美国得克萨斯州奥斯汀特斯拉超级工厂(Cybertruck与Optimus机器人核心生产基地),于2026年1月6日通过《Moonshots》播客正式上线,全时长近3小时。

lpfasd123的博客 2654

【Bug已解决】Codex App returns 401 Missing bearer/basic authentication after login on multiple Windows la

原始报错:Codex App returns 401 Missing bearer/basic authentication after login on multiple Windows laptops场景:用户在 Windows 笔记本上登录应用成功了,但随后每个业务请求都返回 401,提示"Missing bearer/basic authentication"。登录态像是"假的"——明明登了,请求却没带任何认证信息。多台 Windows 设备都能复现。

一键难忘的博客 593

【C++】多态与虚函数:深入理解对象的动态行为(万字长文详解)

多态的概念:通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会 产生出不同的状态。

2301_76677973的博客 1710

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

深入理解C++多态性:虚函数、纯虚函数与抽象类的奥秘

虚函数、纯虚函数和抽象类在C++多态性实现中扮演着至关重要的角色。虚函数通过动态绑定机制,使得基类指针或引用能够指向派生类对象并调用其成员函数,从而实现了多态性。纯虚函数和抽象类则进一步强化了接口与实现的分离,确保了派生类必须实现特定的接口,同时抽象类作为接口类,为系统的扩展和维护提供了便利。在实际编程中,掌握这些概念并灵活运用,能够设计出更加灵活、可扩展和易于维护的软件系统。无论是工厂模式、访问者模式,还是其他设计模式,都离不开多态性这一核心特性。

铭渊老黄 2273

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

深入理解C++多态:从虚函数到动态绑定

本文详细介绍了C++多态的概念与实现机制。多态分为编译时多态(函数重载/模板)和运行时多态(虚函数),重点阐述了运行时多态的实现条件:基类指针/引用调用虚函数,且派生类完成虚函数重写。文章深入讲解了虚函数表原理、动态绑定机制,并对比了重载/重写/隐藏的区别。此外还介绍了纯虚函数、抽象类、override/final关键字等特性,通过内存布局分析揭示了多态底层实现,最后强调了基类析构函数设为虚函数的重要性以防止内存泄漏。全文系统性地剖析了多态相关概念及技术细节。

m0_65245374的博客 3525

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

【C++】深入理解多态与虚函数

本文系统介绍了C++多态的概念与实现。多态是指不同对象调用同一函数产生不同行为,需满足两个条件:虚函数重写(派生类重写基类虚函数)和通过基类指针/引用调用。详细讲解了virtual关键字、虚函数重写规则、协变和析构函数重写等特殊情况,并通过选择题示例说明默认参数继承的特性。此外还介绍了C++11的override和final关键字,用于检查重写和禁止继承。最后区分了重载、重写和重定义,并阐述了抽象类和纯虚函数的作用,强调虚函数继承的是接口而非实现。全文深入浅出地解析了多态机制及其应用场景。

C语言、数据结构、单片机、嵌入式实时操作系统、C++ 学习路径记录 1230

【C++】多态

文章目录概念一、多态的定义及实现1.多态的构成条件2.virtual关键字和虚函数3.虚函数重写4.虚函数重写的三个例外(1)协变(2)析构函数重写①不需要重写虚构函数②需要重写析构函数(3)子类的虚函数可以不用virtual修饰5.final6.override二、抽象类1.概念2.接口继承和实现继承2.读入数据总结 概念 通俗来说就是多种形态,具体一些就是对于某个行为,当不同的对象去完成时会产生出不同的状态。 再进一步到C++中,就是函数调用的多种形态,这一特性可以让我们在调用函数时更加灵活。 多态又

weixin_51983604的博客 7456

C++ 虚函数:深入理解多态的核心机制

虚函数是在基类中声明,并且能在派生类里被重写(override)的成员函数。它允许利用基类指针或引用调用派生类的函数,从而实现运行时多态(Run - time Polymorphism)。public:public:// 输出:Derived class show()delete ptr;return 0;要是show()并非虚函数,那么就会调用,而非。知识点说明虚函数通过virtual关键字定义,可在派生类中重写运行时多态使用基类指针/引用调用派生类的函数。

ziven的博客 1169

C++——深入理解虚函数和纯虚函数

C++ 作为面向对象的语言,主要有三大特性:继承、封装、多态。关于多态,简单说就是同一个函数调用,在不同对象上有不同的表现。也就是用父类型的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”,这是一种泛型技术。所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法。C++ 的多态主要有两种类型:编译时多态(静态多态)和运行时多态(动态多态)。

小拉拉的博客 1511

c++之多态性,什么是多态?如何实现?

目录 多态的概念 概念 多态的定义及实现 多态的构成条件 虚函数 虚函数的重写 虚函数重写的两个例外: C++11 override 和 final 重载、覆盖(重写)、隐藏(重定义)的对比 抽象类 概念 接口继承和实现继承 多态的原理 虚函数表 多态的原理​ 动态绑定与静态绑定 单继承和多继承关系的虚函数表 单继承中的虚函数表 多继承中的虚函数表 多态的概念 概念 多态的概念:通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成.

yizhizainulii的博客 6789

深入理解C++多态

多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。比如Student继承了 Person。Person对象买票全价,Student对象买票半价。那么在继承中要构成多态还有两个条件1. 必须通过基类的指针或者引用调用虚函数2. 被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写这里通过基类引用接收不同派生类对象时,虽然从代码表面看是调用父类函数,但实际会根据对象的实际类型动态选择对应的函数实现。在虚函数的后面写上 =0 ,则这个函数为纯虚函数。

m0_69520125的博客 1332
上一篇: 【开源分享】Conan:C/C++开发者的包管理神器
下一篇: TDA4VM SDK J721E (RTOS/Linux) bootloaders梳理笔记
智驾
博客等级 码龄11年 6670粉丝 574原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

智驾

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值