0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

一文详解虚函数及其相关知识点

C语言编程学习基地 来源:C语言编程学习基地 作者: C语言编程 2021-10-13 10:14 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

本期是C++基础语法分享的第七节,今天给大家来分享一下:

(1)虚析构函数;

(2)纯虚函数;

(3)虚函数、纯虚函数;

(4)虚函数指针、虚函数表;

(5)虚继承;

(6)虚继承、虚函数;

(7)模板类、成员模板、虚函数;

(8)抽象类、接口类、聚合类;

虚析构函数

虚析构函数是为了解决基类的指针指向派生类对象,并用基类的指针删除派生类对象。

虚析构函数使用

class Shape{public: Shape(); // 构造函数不能是虚函数 virtual double calcArea(); virtual ~Shape(); // 虚析构函数};class Circle : public Shape // 圆形类{public: virtual double calcArea(); 。。。};int main(){ Shape * shape1 = new Circle(4.0); shape1-》calcArea(); delete shape1; // 因为Shape有虚析构函数,所以delete释放内存时,先调用子类析构函数,再调用基类析构函数,防止内存泄漏。 shape1 = NULL; return 0;}

纯虚函数

纯虚函数是一种特殊的虚函数,在基类中不能对虚函数给出有意义的实现,而把它声明为纯虚函数,它的实现留给该基类的派生类去做。

virtual int A() = 0;

虚函数、纯虚函数

类里如果声明了虚函数,这个函数是实现的,哪怕是空实现,它的作用就是为了能让这个函数在它的子类里面可以被覆盖(override),这样的话,编译器就可以使用后期绑定来达到多态了。纯虚函数只是一个接口,是个函数的声明而已,它要留到子类里去实现。

虚函数在子类里面可以不重写;但纯虚函数必须在子类实现才可以实例化子类。

虚函数的类用于 “实作继承”,继承接口的同时也继承了父类的实现。纯虚函数关注的是接口的统一性,实现由子类完成。

带纯虚函数的类叫抽象类,这种类不能直接生成对象,而只有被继承,并重写其虚函数后,才能使用。抽象类被继承后,子类可以继续是抽象类,也可以是普通类。

虚基类是虚继承中的基类,暂不做详细说明。

虚函数指针、虚函数表

虚函数指针:在含有虚函数类的对象中,指向虚函数表,在运行时确定。

虚函数表:在程序只读数据段,存放虚函数指针,如果派生类实现了基类的某个虚函数,则在虚表中覆盖原本基类的那个虚函数指针,在编译时根据类的声明创建。

虚继承

虚继承用于解决多继承条件下的菱形继承问题(浪费存储空间、存在二义性)。

底层实现原理与编译器相关,一般通过虚基类指针和虚基类表实现,每个虚继承的子类都有一个虚基类指针(占用一个指针的存储空间,4字节)和虚基类表(不占用类对象的存储空间)(需要强调的是,虚基类依旧会在子类里面存在拷贝,只是仅仅最多存在一份而已,并不是不在子类里面了);当虚继承的子类被当做父类继承时,虚基类指针也会被继承。

实际上,vbptr 指的是虚基类表指针(virtual base table pointer),该指针指向了一个虚基类表(virtual table),虚表中记录了虚基类与本类的偏移地址;通过偏移地址,这样就找到了虚基类成员,而虚继承也不用像普通多继承那样维持着公共基类(虚基类)的两份同样的拷贝,节省了存储空间。

虚继承、虚函数

相同之处:都利用了虚指针(均占用类的存储空间)和虚表(均不占用类的存储空间)

不同之处:

虚继承

(1)虚基类依旧存在继承类中,只占用存储空间

(2)虚基类表存储的是虚基类相对直接继承类的偏移

虚函数

(1)虚函数不占用存储空间

(2)虚函数表存储的是虚函数地址

模板类、成员模板、虚函数

模板类中可以使用虚函数

一个类(无论是普通类还是类模板)的成员模板(本身是模板的成员函数)不能是虚函数

抽象类、接口类、聚合类

抽象类:含有纯虚函数的类

接口类:仅含有纯虚函数的抽象类

聚合类:用户可以直接访问其成员,并且具有特殊的初始化语法形式。满足如下特点:

(1)所有成员都是 public

(2)没有定义任何构造函数

(3)没有类内初始化

(4)没有基类,也没有 virtual 函数

今天的分享就到这里了,大家要好好学C++哟~

编辑:jq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Virtual
    +关注

    关注

    0

    文章

    23

    浏览量

    12733
  • 函数
    +关注

    关注

    3

    文章

    4422

    浏览量

    67836
  • 指针
    +关注

    关注

    1

    文章

    484

    浏览量

    71955

原文标题:C++基础语法梳理:虚函数及其相关知识点

文章出处:【微信号:cyuyanxuexi,微信公众号:C语言编程学习基地】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    示波器小知识点

    示波器的系统带宽:是指个逐渐升高频率的正弦输入信号显示幅度下降3dB时的频率。测试信号般是方波,而方波信号由基波及奇次谐波组成。如果用示波器去测个方波,需要注意示波器应从频率上
    的头像 发表于 04-16 11:04 82次阅读
    示波器小<b class='flag-5'>知识点</b>

    【黑金云课堂笔记】第三期知识点总结

    ,对 FPGA 免费直播课的热情也感染到了黑金云课堂的老师们。接下来我们会再接再厉,把每期直播都做得更扎实   更多精彩课程欢迎关注我们 黑金云课堂全年免费直播课 ,现在让我们先来回顾下上周的知识点精华——   数据类型 常
    的头像 发表于 04-01 16:08 173次阅读
    【黑金云课堂笔记】第三期<b class='flag-5'>知识点</b>总结

    Linux内核伙伴系统内存申请函数详解:从原理到实战

    在 Linux 内核中,内存管理是整个系统稳定运行的基石,而伙伴系统(Buddy System) 作为内核物理内存分配的核心机制,更是驱动开发、内核模块开发的必备知识点。它通过 "2 的幂
    的头像 发表于 02-10 16:58 3726次阅读
    Linux内核伙伴系统内存申请<b class='flag-5'>函数</b><b class='flag-5'>详解</b>:从原理到实战

    带你彻底搞懂K8s网络

    说实话,K8s 网络是我见过最让新手头疼的知识点,没有之。记得我刚接触 K8s 那会儿,看着流量在 Pod、Service、Node 之间穿梭,完全是脸懵逼。后来踩了无数坑,熬了无数夜,总算把这套网络模型摸透了。今天这篇文章
    的头像 发表于 02-06 10:15 708次阅读

    跨阻放大器的断如何分析以及电流的流向?

    理想电流源直接接在运放两端,信号源两端是有电压的,并引入负反馈,续短断仍然成立,那电流岂不是从gnd到gnd,如果能明白这一点,我想应该明白了反馈和实际运放和理想运放的差异。 有两个问题请教: 1
    发表于 09-02 22:40

    【「Yocto项目实战教程:高效定制嵌入式Linux系统」阅读体验】01初读体验

    已阅读部分 由于知识点属于循序渐进,目前花了几天时间读到了第4章, 第章到第二章,主要讲yocto相关的背景知识,主要讲解linux系统以及yocto
    发表于 06-30 21:49

    激光焊锡中焊产生的原因和解决方法

    激光焊锡是发展的非常成熟的种焊接技术,但是在些参数控制不好的情况下,依然会产生些焊接问题,比如说焊的问题。松盛光电来给大家介绍下激
    的头像 发表于 06-25 09:41 2027次阅读

    详解开关电源反馈环路设计

    传递函数中的零、极点,最终确定反馈补偿网络中各元件的参数,以便获得稳定的带宽适中的闭环控制系统,使DC-DC 、AC-DC变换器具有良好的抗干扰性能。
    的头像 发表于 06-05 17:02 3708次阅读
    <b class='flag-5'>一</b><b class='flag-5'>文</b><b class='flag-5'>详解</b>开关电源反馈环路设计

    【「# 运算放大器参数解析与LTspice应用仿真」阅读体验】+全书概览与第章阅读分享

    先来详细阅读下第章,分享下相关内容。 第章主要介绍运放的基础知识,学过模电的都很容易理解,可能教材上学过的忘记了, 这里可以作为摘出来的重点温故知新复习下。全文没有废话,都是娓娓道
    发表于 05-22 23:18

    什么是运放的短和

    在设计运放电路的时候我们经常会接触到两个词,短和断,今天就来和大家分享下什么是运放的虛短和断。我们设运放的同相端电压为up,电流为ip,反相端电压是un,电流为in。在说短和
    的头像 发表于 05-16 19:33 2250次阅读
    什么是运放的<b class='flag-5'>虚</b>短和<b class='flag-5'>虚</b>断

    C51单片机及C语言知识点必备秘籍

    单片机关键知识点览: 系列 1:单片机简叙 2:单片机引脚介绍 3:单片机存储器结构 4:第个单片机小程序 5:单片机延时程序分析 6:单片机并行口结构 7:单片机
    发表于 05-15 14:00

    【必看】开关电源中每个元器件的计算+51页图文详解

    开关电源的各个元器件怎么计算?损耗怎么估算?散热器的大小怎么计算? 51页图文详解带你弄懂! 纯分享贴,有需要可以直接下载附件获取完整资料! (如果内容有帮助可以关注、
    发表于 05-12 16:20

    电机选型计算公式与知识点汇总

    纯分享帖,需要者可点击附件获取完整资料~~~*附件:电机选型计算公式与知识点汇总.pdf 【免责声明】内容转自今日电机,因转载众多,无法确认真正原始作者,故仅标明转载来源。版权归原出处所有,纯分享帖,侵权请联系删除内容以保证您的权益。
    发表于 04-29 16:10

    模拟电路入门100个知识点

    电源之间必须加入个电阻。 5、电子技术分为模拟电子技术和数字电子技术两大部分,其中研究在平滑、连续变化的电压或电流信号下工作的电子电路及其技术,称为模拟电子技术。 6、PN结反向偏置时,PN结的内
    发表于 04-25 15:51

    详解锡膏工艺中的焊现象

    在锡膏工艺中,焊(Cold Solder Joint)是种常见的焊接缺陷,表现为焊点表面看似连接,但实际存在电气接触不良或机械强度不足的问题。焊可能导致产品功能失效、可靠性下降甚至短路风险。以下从成因、表现、影响、检测及预
    的头像 发表于 04-25 09:09 3150次阅读
    <b class='flag-5'>详解</b>锡膏工艺中的<b class='flag-5'>虚</b>焊现象