virtual关键字与多态

<C++>初识多态,剖析virtual关键字 熬过无人问津的日子,才有诗和远方✨写在前面 多态是C++面向对象三大特性之一函数重写和重载的比较 下面用具体代码讲解多态: 这里把Animal类设为父类,子类Dog和子类Cat都公共继承Animal父类。父类中的eat前加了virtual关键字,那么eat函数就被叫做虚函数,这些就满足了多态的条件。此外,doEat函数的参数列表是父类的引用,那么也就满足了多态使用的父类引用或指针指向子类对象。 如果doEat不加引用,那么运行结果就会是: vi 阅读详情

今天在网上看到这么一段博文(以下蓝色为引用):

一,  什么是虚函数(如果不知道虚函数为何物,但有急切的想知道,那你就应该从这里开始)

简单地说,那些被virtual关键字修饰的成员函数,就是虚函数。虚函数的作用,用专业术语来解释就是实现多态性(Polymorphism),多态性是将接口与实现进行分离;用形象的语言来解释就是实现以共同的方法,但因个体差异而采用不同的策略。下面来看一段简单的代码

class A{
public:
void print(){ cout<<”This is A”<<endl;}
};

class B:public A{
public:
void print(){ cout<<”This is B”<<endl;}
};

int main(){   //为了在以后便于区分,我这段main()代码叫做main1
A a;
B b;
a.print();
b.print();
}

通过class A和class B的print()这个接口,可以看出这两个class因个体的差异而采用了不同的策略,输出的结果也是我们预料中的,分别是This is A和This is B。但这是否真正做到了多态性呢?No,多态还有个关键之处就是一切用指向基类的指针或引用来操作对象。那现在就把main()处的代码改一改。

int main(){   //main2
A a;
B b;
A* p1=&a;
A* p2=&b;
p1->print();
p2->print();
}

运行一下看看结果,哟呵,蓦然回首,结果却是两个This is A。问题来了,p2明明指向的是class B的对象但却是调用的class A的print()函数,这不是我们所期望的结果,那么解决这个问题就需要用到虚函数

class A{
public:
virtual void print(){ cout<<”This is A”<<endl;}  //现在成了虚函数了
};

class B:public A{
public:
void print(){ cout<<”This is B”<<endl;}  //这里需要在前面加上关键字virtual吗?
};

毫无疑问,class A的成员函数print()已经成了虚函数,那么class B的print()成了虚函数了吗?回答是Yes,我们只需在把基类的成员函数设为virtual,其派生类的相应的函数也会自动变为虚函数。所以,class B的print()也成了虚函数。那么对于在派生类的相应函数前是否需要用virtual关键字修饰,那就是你自己的问题了。

现在重新运行main2的代码,这样输出的结果就是This is A和This is B了。
重点在main2中,没有virtual关键字,即使是用基类的指针指向派生类,也还是达不到多态的目的。这是之前没有注意到的,是这样吗?有待实际运行一下来验证。

【从零开始入门unity游戏开发之——C#篇25】C#面向对象动态多态——virtual、override 和 base 关键字、抽象类和抽象方法 C#面向对象动态多态——virtual、override 和 base 关键字、抽象类和抽象方法 阅读详情

相关推荐

【虚幻引擎】UE4初学者系列教程基础篇-全中文新手入门教程(UE5系列继续更新)

菜单栏菜单栏当中有文件、编辑、窗口帮助。文件当中可以进行一个关卡的新建、关卡的打开、关卡的保存还有就是打包项目,(项目大于关卡,项目里面可能有几百个关卡),这是比较常用的几个,这里可以看到打包当中有安卓端HTML5端,IOS端linux,还有就是TVOS(苹果电视)、windows的一些端口的一些设置。还可以打开最近打开的项目。关卡编辑器:工具栏3.3 “模式”面板保存所有:ctrl+shift+s(有的软件截屏也是这个按键需要注意)3.4 “内容浏览器”面板缩放:ctr+鼠标滚轮3.5.视口面板。

qq_45206556的博客 2万+

虚函数

文章目录虚函数虚函数的定义虚函数使用的注意事项虚表什么是虚表图解说明虚表的四种情况一般继承(无虚函数覆盖)一般继承(有虚函数覆盖)多重继承(无虚函数覆盖)多重继承(由虚函数覆盖) 虚函数虚函数的定义 虚函数是一个类的成员函数,它的定义语法如下: 特别注意: 当一个类的一个成员函数被定义为虚函数时,则由该类派生出来的所有派生类中,该函数始终保持虚函数的特征 当在派生类中重新定义虚函数时,不必加关...

weixin_38607041的博客 1万+

FPGA时序约束--实战篇(读懂Vivado时序报告)

本文将详细介绍如何读懂Vivado时序报告,包括报告的基本结构和如何分析报告。

mengzaishenqiu的博客 1万+

虚函数详细理解

在实现c++多态时会用到虚函数。虚函数使用的其核心目的是通过基类访问派生类定义的函数。所谓虚函数就是在基类定义一个未实现的函数名,为了提高程序的可读性,建议后代中虚函数都加上virtual关键字。一般格式:上述代码在基类中定义了一个test的虚函数,所有可以在其子类重新定义父类的做法这种行为成为覆盖(override),或者为重写。常见用法:声明基类指针,利用指针指向任意一个子类对象,调用相关的虚函数,动态绑定,由于编写代码时不能确定被调用的是基类函数还是那个派生类函数,所以被称为“”虚“”函数。

chen_ever的博客 2442

Abaqus边界条件设置避坑指南:为什么你的实体单元转动自由度总是不生效?

本文深入解析了Abaqus中实体单元转动自由度设置失效的根本原因。从力学原理与有限元节点自由度的本质区别出发,阐明了实体单元仅具有平动自由度,直接约束其转动自由度是无效操作。文章提供了对称边界条件的正确设置方法,并给出了使用耦合约束等高级方案来模拟真实抗转动约束的实战指南,帮助用户避免常见建模陷阱。

weixin_29290379的博客 621

手把手教你用Docker快速部署ZLMediaKit流媒体服务器(含WebRTC配置)

本文详细介绍了如何使用Docker快速部署ZLMediaKit流媒体服务器,并配置WebRTC功能。通过容器化部署,实现环境一致性、资源隔离和快速扩展,同时提供WebRTC专项配置、多协议推拉流实战测试及生产环境优化建议,帮助开发者高效搭建企业级流媒体平台。

agile9scrum的博客 203

虚函数详解

一、什么是虚函数 类的成员函数前加 virtual 这种函数就叫做虚函数 二、和虚函数相关的一些概念 1、纯虚函数:在虚函数的声明的后面添加=0,这种虚函数就叫纯虚函数。可以不实现,但如果实现必须在类外(只能在父类的构造函数、析构函数中调用) 2、抽象类:成员函数中有纯虚函数,这种类叫抽象类,抽象类不能实例化(不能创建对象),抽象类必须被继承且纯虚函数被覆盖后,由子类实例化对象,如果继承抽象类,但...

程序员小明 8372

【ubuntu】【VirtualBox】VirtualBox无法加载USB移动设备的解决方法(支持U盘启动盘)

提示:测试可用。

联系方式:927632640 2440

C++基础之虚函数

一.虚函数的定义 虚函数是指在基类中声明为virtual并在一个或多个派生类中被重定义的成员函数,即被virtual关键字修饰的成员函数。 具体格式为:virtual 返回值类型 函数名(参数表){函数体}。 注意:我们知道,在同一个类中不能定义两个名字相同、参数个数和类型都相同的函数,否则就是“重复定义”,但是在类的继承层次结构中,在不同的层次中可以出现名字相同、参数个数和类型都相同而功能不同的函数。 二.虚函数的作用 C++中的虚函数的作用主要是实现了多态的机制。简而言之就是用父类型别的指针指向其子

baidu_41191295的博客 3141

YOLOv13必学核心:SKAttention选择性核注意力机制原理 + 实战全拆解

SKAttention的核心思想来源于人类视觉系统的一个重要特性:根据不同的视觉刺激,人眼能够自适应地调整感受野大小。SKAttention将这一生物学原理转化为深度学习中的注意力机制,通过动态选择和融合不同大小的卷积核,实现了自适应的多尺度特征提取。在人类视觉皮层中,不同的神经元具有不同大小的感受野,而且这些感受野的大小会根据视觉刺激的类型动态调整。本文将深入解析SKAttention模块的设计原理、数学基础、实现细节,以及其在YOLOv13目标检测框架中的集成应用,为读者提供全面而深入的技术理解。

FJN110的博客 97

三相五柱式消弧线圈自动测控装置设计与实现

本文设计了一种基于STM32的三相五柱式消弧线圈自动测控装置。该装置采用信号注入法检测系统对地电容电流,通过PID自适应算法调节消弧线圈电感值,实现单相接地故障时的快速补偿。硬件系统包含信号采集、注入、控制执行等模块,软件采用Goertzel算法提取特征频率信号,结合增量式PID实现精确控制。实验结果表明,装置电容检测误差小于2%,调谐响应时间小于50ms,满足配电网对消弧线圈自动调谐的技术要求。

AI的内部世界的博客 239

虚函数的定义、用法以及纯虚函数和虚析构函数

虚函数是一种成员函数,它允许子类重写(override)父类中定义的函数。 虚函数的重要意义便是实现多态性。 多态性是面向对象编程的一个核心概念:即同一个接口可以有不同的实现,从而实现代码的灵活性和通用性。虚函数的关键字为virtual。用virtual关键字来声明一个函数为虚函数。声明一个虚函数的目的是允许派生类重写该函数,以提供特定的实现,而通过基类的指针或引用调用虚函数时,将根据对象的实际类型来调用相应的函数实现。

shaohua_du的博客 2391

(十五)CX20106A 中超声波测量的应用

(十五)CX20106A 中超声波测量的应用

m0_52555663的博客 4515

【学习笔记】virtual 关键字,虚函数与多态

就是一个函数在不同的场景下,表现出不同的状态(行为,特性等)。下面举两个例子,第一个例子比较偏生活。比如你是一家公司的 CEO,你手下有销售部,运营部,技术部三个部门,你对三个部门下达一个指令。

码的世界 4335

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

继承与多态 virtual关键字的使用场景

父类子类有同名函数时在外部调用时如果不加父类名则会默认调用子类的函数。C++有函数重写的功能需要添加virtual关键字,当时写上篇博文的时候在想那么既然默认使用子类的同名函数那么这个virtual有什么意义呢? 这篇博文主要讲述 多态:一句相同的语句能有不同的实现。      当父类和子类有同名函数,调用时牵扯到了指针那么就跟virtual有关系了。   看以下几种情况:   定义两个...

zzt4326的博客 341

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

【C++ 关键字 virtual 】C++ virtual 关键字(将成员函数声明为虚函数实现多态

在C++的早期设计中,通过基类指针可以访问派生类的成员变量,这是由于派生类对象在内存中的布局是基类成员变量在前,派生类成员变量在后。因此,当我们使用基类指针指向派生类对象时,可以正常访问到派生类中从基类继承来的成员变量。 然而,对于成员函数,情况就不同了。在编译时期,成员函数并不会被放入对象的内存空间中,而是存放在一块单独的内存区域,每个类只有一份成员函数的代码。当我们通过基类指针调用成员函数时,编译器会根据指针的静态类型(也就是基类类型)去查找对应的成员函数,而不是动态类型(也就是实际指向的派生类类型)

探索C++编程的奥秘,分享深入的技术见解和实践,旨在激发读者创造力与解决问题的思维。 3098

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

CPlusPlus - #016 virtual关键字实现多态

virtual关键字实现多态

AlanL的专栏 360

C++多态特性:virtual关键字的使用

C++多态特性:virtual关键字的使用

欧特GO 627

【C++多态】 --- 多态问题抛出与virtual关键字

1. C++中多态的概念 C++中所谓的多态(polymorphism)是指,由继承而产生的相关的不同的类,其对象对同一消息会作出不同的响应。 2. C++多态问题抛出 下面看一个具体的例子: #include <iostream> #include <stdlib.h> using namespace std; class Animal { public: void speak(void) { cout << "动物在说话" << en

M2嵌入式 534

不使用virtual关键字实现C++多态

#include using namespace std; /* 不使用virtual实现多态可以用成员函数指针完成。 成员函数指针形式:返回类型(A::*指针名)(形参表) 其中A是类类型,即这个指针是指向A类的成员函数的函数指针 例如:int(A::*P)(int,int)这

iFuMI的博客 1359

c++多态——virtual关键字,C++11 override 和 final,析构函数的重写。

c++多态——virtual关键字,C++11 override 和 final,析构函数的重写。

zgwnb666的博客 1328

c++中virtual关键字的作用与Java中多态的一点对比

动机 最近一直在使用C++写win32程序,用了一些库,里面提供的类和demo各种是virtual这个关键字,一直不是很明白到底是啥用,于是查看了一些文档,写小程序来实验它的作用。 结论 virtual这个关键字的发挥作用是在子类去继承父类的时候。比如: class Person { public: void foo1() ...

weixin_33853827的博客 353

C++中的virtual与inline:实现多态与内联调用的关键字

详细介绍了C++中的两个重要关键字:virtual和inline。virtual用于实现多态,允许子类重新定义父类的方法;而inline用于内联函数,可以在调用点直接展开函数体,以提高程序的运行效率。

qq_35320456的博客 1183

C++ 学习笔记 (七)继承与多态 virtual关键字的使用场景

  在上一篇C++ 学习笔记 (六) 继承- 子类与父类有同名函数,变量中说了当父类子类有同名函数时在外部调用时如果不加父类名则会默认调用子类的函数。C++有函数重写的功能需要添加virtual关键字,当时写上篇博文的时候在想那么既然默认使用子类的同名函数那么这个virtual有什么意义呢? 这篇博文主要讲述 多态:一句相同的语句能有不同的实现。      当父类和子类有同名函...

argentina1111的博客 308

virtual关键字及多态的实现

virtual关键字

u010039733的专栏 478

virtual 是 C++ 中的一个关键字,用于实现多态性(polymorphism)

是 C++ 中的一个关键字,用于实现多态性(polymorphism)。它的主要作用是在基类中声明虚函数(virtual function),允许派生类重写这些函数,并在运行时根据对象的实际类型调用适当的函数版本。关键字使得 C++ 支持运行时多态性,这意味着在程序运行时,根据对象的实际类型选择合适的函数版本。这种机制广泛应用于面向对象编程,尤其是在需要处理一组相关对象时,通过基类指针或引用统一操作。

m0_46376834的博客 987
上一篇: 邮件收发协议相关
下一篇: http header详解
zhhx310
博客等级 码龄18年 2粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值