C++Virtual关键字用法

10. C++关键字virtual用法 派生类会拥有基类定义的函数,但是对于某些函数,有时候希望每个派生类各自定义适合于自己版本的函数,于是基类就将此函数定义为虚函数,让派生类各自实现自己功能版本的函数,也可以不实现;这就是virtual关键字的主要作用。「构造函数不能是虚函数」。在构造函数中调用虚函数,实际运行的是父类的相应函数。因为自己还没有构造好,多态还无法正常使用。「将一个函数定义为纯虚函数。实际上是将这个类定义为抽象类,不能实例化对象」。「纯虚函数通常未定义体,但也可以能够拥有」, 甚至能够显示的调用。 阅读详情

1、虚函数

使用虚函数  + 继承 + 基类指针 来实现多态

2、虚析构

    如果一个类用作基类,我们通常需要virtual来修饰它的析构函数,这点很重要。如果基类的析构函数不是虚析构,当我们用delete来释放基类指针(它其实指向的是派生类的对象实例)占用的内存的时候,只有基类的析构函数被调用,而派生类的析构函数不会被调用,这就可能引起内存泄露。如果基类的析构函数是虚析构,那么在delete基类指针时,继承树上的析构函数会被自低向上依次调用,即最底层派生类的析构函数会被首先调用,然后一层一层向上直到该指针声明的类型

3、虚基类(Virtual base class)-其实就是虚继承

      为解决多重继承时的二义性提出来的,如果一个派生类有多个直接基类,而这些直接基类又有一个共同的基类,则在最终的派生类中会保留该间接共同基类数据成员的多份同名成员,这种现象是人们不希望出现的,所以C++使用虚基类来使得在继承间接共同基类时只保留一份成员。使用方法:

class  A{…};  //声明基类A
class B :virtual public A {…};   //声明类B是类A的公用派生类,A是B的虚基类
class C :virtual public A{…};   //声明类C是类A的公用派生类,A是C的虚基类

虚基类并不是在声明基类时声明的,而是在声明派生类时,指定继承方式时声明的。因为一个基类可以在生成一个派生类时作为虚基类,而在生成另一个派生类时不作为虚基类。

声明虚基类的一般形式为
   class 派生类名: virtual 继承方式 
基类名

经过这样的声明后,当基类通过多条派生路径被一个派生类继承时,该派生类只继承该基类一次。
需要注意: 为了保证虚基类在派生类中只继承一次,应当在该基类的所有直接派生类中声明为虚基类。否则仍然会出现对基类的多次继承。如:
class  A{…};  //声明基类A
class B :virtual public A {…};   //声明类B是类A的公用派生类,A是B的虚基类
class C :virtual public A{…};   //声明类C是类A的公用派生类,A是C的虚基类
class D :public A{…};   
class E :public B,C,D{…};   
  派生类B和C中将类A声明为虚基类,而派生类D中没有将类A声明为虚基类,则在派生类E中,虽然从类B和C路径派生的部分只保留一份基类成员,但从类D路径派生的部分还保留一份基类成员。

4、纯虚函数

含有纯虚函数的类叫做抽象类。纯虚函数如下:

void virtual foo() = 0;

抽象类:抽象类只能作为基类来派生新类,不能声明抽象类的对象。(既然都是一个抽象概念了,纯虚函数没有具体实现方法,故不能创造该类的实际的对象)

但是可以声明指向抽象类的指针变量或引用变量,通过指针或引用,就可以指向并访问派生类对象,进而访问派生类的成员。(体现了多态性)

【C++】虚拟基类(virtual Base Class)详解:为什么要有虚拟基类? 在虚拟继承中,派生类会继承多个基类的虚表指针,这些虚表指针需要存储在对象的内存中,导致对象的内存空间变得更大,同时也会增加对象的构造和析构的时间开销。在派生类的构造函数中,虚拟基类的构造函数会在其它基类的构造函数执行之前被调用,以确保虚拟基类在所有的子对象之前被初始化。在类D中,虚拟基类A只有一个副本,它被类B和类C所共享。在上面的图中,类D继承自类B和类C,而类B和类C都继承自类A。因此,在设计类继承关系时,需要权衡继承层次结构的复杂性和性能开销之间的平衡,尽量避免过度使用虚拟继承。 阅读详情

相关推荐

C++中virtual关键字的用法

关于virtual关键字的用法总结如下,有错误或者总结不到位的情况请能帮本人指出,非常感谢! Virtual是C++ OO机制中很重要的一个关键字。只要是学过C++的人都知...

李肖遥的专栏 884

虚函数和纯虚函数

    在面向对象的C++语言中,虚函数(virtual function)是一个非常重要的概念。因为它充分体现了面向对象思想中的继承和多态性这两大特性,在C++语言里应用极广。比如在微软的MFC类库中,你会发现很多函数都有virtual关键字,也就是说,它们都是虚函数。难怪有人甚至称虚函数是C++语言的精髓。 那么,什么是虚函数呢,我们先来看看微软的解释: 虚函数是指一个类中你希望重载的成员函数

doncai的专栏 1999

MCGSPro动画部件实战:用文本分段实现智能报警提示(附工程文件)

本文详细介绍了在MCGSPro组态软件中,如何利用动画部件的文本分段功能,高效实现触摸屏上的智能报警提示。通过绑定整数变量作为索引,一个部件即可动态切换多种状态信息,解决了传统方法画面臃肿、维护繁琐的痛点。文章提供了从变量定义、部件配置到逻辑联动的完整实战教程,并分享了工程文件复用与性能优化技巧。

weixin_28347369的博客 167

C++关键字之virtual

C++关键字之virtual 1. 虚基类 在C++之继承的多重继承引起的二义性问题中讲到,解决二义性问题的另一个方法就是用关键字virtual。具体做法就是虚基类。 1.1 声明虚基类 虚基类的声明并不是在声明基类时声明的,而是在声明派生类时,指定继承方式时声明的。声明时只需在派生类指定继承方式前面加上关键字virtual即可。 class A {int a}; clas...

NeverWA的博客 1万+

Halcon图片拼接避坑指南:特征点匹配常见问题与解决方案

本文深入解析Halcon图片拼接中特征点匹配的常见问题与解决方案,涵盖特征点提取、匹配优化及变换模型选择等关键环节。针对工业视觉检测中的拼接错位、重影等问题,提供参数调优、图像预处理和算法选择等实战技巧,帮助开发者高效避坑并提升拼接精度。

weixin_28694169的博客 199

BPMN-JS :修改节点“Change Type”事件类型

修改路径:node_modules\bpmn-js\lib\features\replace\ReplaceOptions.js。

TaylorY的博客 679

C++之virtual虚函数的几种用法

1. virtual function base class(virtual ), derived class(override) 2. virtual destructor 3. pure virtual function it is Claimed in base class without implementation, and enforce the subclass (derived class) to implement

qq_34107003的博客 732

labview中DAQ采集多个数据通道(温度传感器)(TTL信号的曲轴位置传感器)总结

文章目录前言一、面对的问题篇二、问题解决篇三、后续工作总结 前言 我研一的项目利用labview软件和NI数据采集卡采集发动机传感器的信号然后进行采集,发动机传感器是有很多种的,所以难以避免的需要采集多个通道的传感器信号。 一、面对的问题篇 前篇已经写道我已经将温度传感器的信号采集出来,也可以将其数据进行信号处理,由电压信号转变为温度值。但是想要采集多个通道的信号,加上TTL信号的曲轴位置传感器,我模仿温度传感器采集的程序另加了一个DAQ助手进行采集。也就是如图所示的程序: 但是这个程序不能正常显

xiaobaiwsc的博客 1万+

c++ 虚函数实现原理

对C++ 了解的人都应该知道虚函数(Virtual Function)是通过一张虚函数表(Virtual Table)来实现的。简称为V-Table。 虚函数表指针(vptr)创建时机 vptr跟着对象走,所以对象什么时候创建出来,vptr就什么时候创建出来,也就是运行的时候。 当程序在编译期间,编译器会为构造函数中增加为vptr赋值的代码(这是编译器的行为),当程序在运行时,遇到创建对象的代码,执行对象的构造函数,那么这个构造函数里有为这个对象的vptr赋值的语句。 二:虚函数表创建时机 虚函数表创..

baidu_16370559的博客 2050

UG\NX二次开发 获取对象的引用集

获取对象的引用集,一个对象可能有多个引用集,下面这个封装函数可以获取对象的所有引用集。

王牌飞行员_里海的博客 489

ChangeMamba训练调试

此仓库的代码是在 Linux 系统下运行的。我们尚未测试是否能在其他操作系统下运行。 首先需要安装VMama仓库。以下安装顺序取自VMama仓库。克隆该版本库并导航至项目目录: 建议设置 conda 环境并通过 pip 安装依赖项。使用以下命令设置环境: 创建并激活新的 conda 环境 安装依赖项 检测和分割任务的依赖库(在 VMamba 中为可选项) 二、下载预训练权重 另外,请下载VMamba-Tiny, VMamba-Small, and VMamba-Base在ImageNet上的预训练权重并把它

hanfeng5268的博客 576

c++中virtual关键字的用法

在上述示例中,`Shape` 类中的 `draw()` 函数被声明为虚函数,并在派生类 `Circle` 和 `Square` 中进行了重写。通过使用基类指针指向派生类对象,并调用虚函数 `draw()`,实际上会根据对象的实际类型来调用相应的重写函数,实现了多态性和动态绑定。这种自动调用基类析构函数的行为是由 C++ 的析构函数机制所决定的,它确保了在对象销毁的过程中,从派生类到基类的顺序正确执行析构函数,以正确释放对象及其基类所拥有的资源。因此,无需显式调用基类的析构函数,它会在适当的时机自动执行。

weixin_37841024的博客 607

Alist/Openlist 的 WebDAV 老是连不上?别再乱试了,这才是标准答案!(1Panel如何使用Alist/Openlist作为备份账号)

😫服务器硬盘告急,想用 Alist/Openlist 的 WebDAV 备份却屡屡失败?别慌!本文带你揭秘正确的连接地址和权限配置,手把手教你搞定 1Panel 备份设置,让你的网盘秒变备份仓库!

XiaoqiangClub的博客 5590

C++: Virtual关键字的几种用法

virtual在英文中表示“虚”、“虚拟”的含义。c++中的关键字“virtual”主要用在两个方面:虚函数与虚基类。下面将分别从这两个方面对virtual进行介绍。1.虚函数 虚函数源于c++中的类继承,是多态的一种。在c++中,一个基类的指针或者引用可以指向或者引用派生类的对象。同时,派生类可以重写基类中的成员函数。这里“重写”的要求是函数的特征标(包括参数的数目、类型和顺序)...

不忘初心 3157

52、切换线性动态系统:原理、挑战与高斯和滤波解决方案

本文介绍了切换线性动态系统(SLDS)的基本原理及其在复杂时间序列建模中的应用。SLDS结合了隐马尔可夫模型的离散状态切换与线性动态系统的连续状态演化,适用于系统动态发生跳跃的场景,如化工过程监测和金融市场分析。由于精确推理在计算上不可行,文章重点阐述了高斯和滤波这一近似方法,通过有限高斯混合来逼近后验分布,并详细描述了其递归更新、权重计算与组件合并流程。同时讨论了性能评估、优化策略及常见问题的解决方案,并展望了SLDS与深度学习、在线学习和多模态融合的未来发展方向。

algae的博客 161

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

c++关键字virtual的用法(面试)

virtual在c++继承中的用法 virtual在c++多态中的用法

weixin_44974029的博客 1620

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

c语言使用virtual类型,C++中的virtual关键字用法总结

virtual关键字--C++Virtual 是C++OO机制中很重要的一个关键字。只要是学过C++的人都知道在类Base中加了Virtual关键字的函数就是虚拟函数(例如函数print),于是在Base的派生类Derived中就可以通过重写虚拟函数来实现对基类虚拟函数的覆盖。当基类Base的指针point指向派生类Derived的对象时,对point的print函数的调用实际上是调用了Deriv...

weixin_33196034的博客 1213

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

C++ virtual

当一个类从多个基类继承,而这些基类又共享一个更基础的基类时,如果没有使用虚基类,那么在派生类中会存在基础基类的多个实例,这会导致成员变量的二义性和资源浪费。这意味着如果派生类中有一个同名、同参数列表的函数,那么这个函数将被视为是对基类虚函数的重写。当通过基类的指针或引用调用这个函数时,C++运行时系统会查找并调用实际对象类型中相应的函数。虚基类确保即使在多重继承的路径中,共享的基础基类也只被继承一次,从而保证了成员变量的唯一性。(动态多态):通过虚函数实现,允许在运行时根据对象的实际类型选择合适的方法。

qq_52114236的博客 2737

virtual关键字在父类

运行结果是什么? father *pss1 = new sonson(); pss1->f(); delete pss1; son *pss2 = new sonson(); pss2->f(); delete pss2; sonson *pss3 = new sonson(); pss3->f(); delete pss3; 运行结果 sonson::f() sonson...

幸福在路上 768

C/C++中的核心关键字:static extern const virtual volatile等

本文摘要:文章系统梳理了C/C++核心关键字及其特性。C语言部分重点解析了static的多重用途(变量生命周期控制、文件作用域限制)、const的跨语言差异、volatile的硬件交互特性、sizeof与strlen的区别,以及extern的跨文件调用机制。C++特有部分深入探讨了virtual实现的多态原理、new/delete与malloc/free的对象构造差异、this指针的隐式特性,以及template实现的泛型编程范式。通过对比C与C++关键字的异同(如const处理方式),揭示了两种语言在内存

nbwoshi的博客 344

浅析c++中virtual关键字

1.virtual关键字主要是什么作用? c++中的函数调用默认不适用动态绑定。要触发动态绑定,必须满足两个条件:第一,指定为虚函数;第二,通过基类类型的引用或指针调用。 由此可见,virtual主要主要是实现动态绑定。 2.那些情况下可以使用virtual关键字? virtual可用来定义类函数和应用到虚继承。 友元函数 构造函数 static静态函数 不能用virtu

djh512的专栏 3万+

C++基础之关键字——virtual详解

virtual C++中的virtual关键字主要有这样几种使用场景:第一,修饰父类中的函数 ;第二,修饰继承性。注意:友元函数、构造函数、static静态函数不能用virtual关键字修饰。普通成员函数和析构函数可以用virtual关键字修饰。 virtual具有继承性:父类中定义为virtual的函数在子类中重写的函数也自动成为虚函数。 修饰父类中的函数 修饰父类中的函数主要分为三种:普通函数、析构函数和纯虚函数。 修饰父类中的普通函数 被修饰的函数称为虚函数, 是C++中多态的一种实现(多说一句,多态

itlilyer的博客 3万+

C++类继承中的几个常用关键字

C++编程中,尤其是对于大型的项目,正确的使用关键字能有效的避免我们犯错误,下面列出几个常用的关键字来巩固一下:virtual:该关键字一般在父类中出现用来表示通过该关键字标记的方法希望子类覆盖,当子类实现覆盖后,默认情况下子类的该方法还是虚方法。=0:表示标记的方法必须是虚方法,且必须被子类覆盖。当一个类中出现一个该方法时,则该类即为抽象类,抽象类不能直接创建对象必须被继承。override:该...

qq_32931387的博客 3371
上一篇: 堆排序
下一篇: C#实现多态的几种方式
sindyra
博客等级 码龄9年 66粉丝 72原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值