C/C++基础语法复习(三):C++重载函数,多态,虚函数

C++虚函数概念及使用(基础) 所谓基础不牢,地动山摇。当面试官问到我虚函数和虚析构函数的时候,我真的一点都记不起来了,于是胡说八道,出丑万分。今天就总结一下虚函数的一些内容吧。 依照我的习惯,我们先看几个问题: 什么是虚函数? 什么是多态性? 多态性是怎么实现的? 以上三个问题我完全搞混了,所以面试当场气氛很尬。接下来抱着解决问题的态度来复习一下这些知识点,希望以后能记住。 什么是虚函数? 在某基类中... 阅读详情

 

1.重载运算符和重载函数:

C++ 允许在同一作用域中的某个函数和运算符指定多个定义,分别称为函数重载和运算符重载。

重载声明是指一个与之前已经在该作用域内声明过的函数或方法具有相同名称的声明,但是它们的参数列表和定义(实现)不相同。

当您调用一个重载函数或重载运算符时,编译器通过把您所使用的参数类型与定义中的参数类型进行比较,决定选用最合适的定义。

选择最合适的重载函数或重载运算符的过程,称为重载决策。

 

a.函数重载:

在同一个作用域内,可以声明几个功能类似的同名函数,但是这些同名函数的形式参数(指参数的个数、类型或者顺序)必须不同。您不能仅通过返回类型的不同来重载函数。

 

b.运算符重载:

您可以重定义或重载大部分 C++ 内置的运算符。这样,您就能使用自定义类型的运算符。

重载的运算符是带有特殊名称的函数,函数名是由关键字 operator 和其后要重载的运算符符号构成的。与其他函数一样,重载运算符有一个返回类型和一个参数列表。

详细例子:https://www.runoob.com/cplusplus/cpp-overloading.html

 

2.多态:

多态按字面的意思就是多种形态。当类之间存在层次结构,并且类之间是通过继承关联时,就会用到多态。

C++ 多态意味着调用成员函数时,会根据调用函数的对象的类型来执行不同的函数。

例子:https://www.runoob.com/cplusplus/cpp-polymorphism.html

 

文字版解释:

假设我们有个基类叫shape,成员函数area,而其两个子类的成员函数也有area(同名)。

如果你想调用两个子类的函数area时候会发现程序仍然会调用shape(父类)的area函数。

导致错误输出的原因是,调用函数 area() 被编译器设置为基类中的版本,这就是所谓的静态多态,或静态链接 - 函数调用在程序执行前就准备好了。有时候这也被称为早绑定,因为 area() 函数在程序编译期间就已经设置好了。

解决办法就是 基类 的area函数声明改成  

virtualintarea(){

}

此时,编译器看的是指针的内容,而不是它的类型。因此,由于 tri 和 rec 类的对象的地址存储在 *shape 中,所以会调用各自的 area() 函数。

正如您所看到的,每个子类都有一个函数 area() 的独立实现。这就是多态的一般使用方式。有了多态,您可以有多个不同的类,都带有同一个名称但具有不同实现的函数,函数的参数甚至可以是相同的。

 

虚函数 :

是在基类中使用关键字 virtual 声明的函数。在派生类中重新定义基类中定义的虚函数时,会告诉编译器不要静态链接到该函数。

我们想要的是在程序中任意点可以根据所调用的对象类型来选择调用的函数,这种操作被称为动态链接,或后期绑定。

 

纯虚函数:

您可能想要在基类中定义虚函数,以便在派生类中重新定义该函数更好地适用于对象,但是您在基类中又不能对虚函数给出有意义的实现,这个时候就会用到纯虚函数。

virtualintarea()=0;

纯虚函数一定没有定义,纯虚函数用来规范派生类的行为,即接口。包含纯虚函数的类是抽象类,抽象类不能定义实例,但可以声明指向实现该抽象类的具体类的指针或引用。

 C++中, 虚函数可以为private, 并且可以被子类覆盖(因为虚函数表的传递),但子类不能调用父类的private虚函数。虚函数的重载性和它声明的权限无关。

一个成员函数被定义为private属性,标志着其只能被当前类的其他成员函数(或友元函数)所访问。而virtual修饰符则强调父类的成员函数可以在子类中被重写,因为重写之时并没有与父类发生任何的调用关系,故而重写是被允许的。

编译器不检查虚函数的各类属性。被virtual修饰的成员函数,不论他们是private、protect或是public的,都会被统一的放置到虚函数表中。对父类进行派生时,子类会继承到拥有相同偏移地址的虚函数表(相同偏移地址指,各虚函数相对于VPTR指针的偏移),则子类就会被允许对这些虚函数进行重载。且重载时可以给重载函数定义新的属性,例如public,其只标志着该重载函数在该子类中的访问属性为public,和父类的private属性没有任何关系!

纯虚函数可以设计成私有的,不过这样不允许在本类之外的非友元函数中直接调用它,子类中只有覆盖这种纯虚函数的义务,却没有调用它的权利。

引用:https://www.runoob.com/cplusplus/cpp-polymorphism.html

如果你正在学习C/C++编程知识,感觉C/C++编程知识有困难的话,欢迎来和博主一起交流:C++编程

C++复习笔记 继承是一种面型对象编程的核心概念,他允许一个类(派生类/子类)获取另一个类(基类/父类)的全部成员变量和成员函数。友元关系不能被继承。基类定义static静态成员,则整个继承体系中只有一个这样的成员多态允许我们使用基类指针或引用来调用派生类的函数(举例:游戏中不同的角色使用同一类技能造成的不同的效果是一种多态)方法重写允许子类改变父类方法的行为。当子类对象调用一个方法时,如果该方法在子类中已经被重写,则执行子类的方法;否则,执行父类的方法。这种行为在运行时确定,因此被称为动态绑定或运行时多态。 阅读详情

相关推荐

⭐️白嫖的阿里云认证⭐️ 【真题&参考答案】:大模型Clouder认证:利用大模型提升内容生产能力

【摘要】真题「大模型Clouder认证:利用大模型提升内容生产能力」

davidkorhenn的博客 1921

虚函数表

虚函数表(Virtual Table,V-Table):使用 V-Table 实现 C++ 的多态。在这个表中,主要是一个类的虚函数的地址表,这张表解决了继承、覆盖的问题,保证其真实反应实际的函数。这样,在有虚函数的类的实例中分配了指向这个表的指针的内存,所以,当用父类的指针来操作一个子类的时候,这张虚函数表就显得尤为重要了,它就像一个地图一样,指明了实际所应该调用的函数。 编译器应该保证虚函数

qihaixiang的专栏 891

Jitsi中的Prosody(谐音:破扫敌)介绍

凭借其灵活的插件系统、强大的安全性和出色的性能,Prosody 成为许多企业和开发者构建定制化通信解决方案的首选。在 Jitsi 的多方视频会议场景中,Prosody 不仅处理基本的信令任务,还需要与其他组件(如 Jitsi Videobridge)协作,确保视频流的正确分发和控制。Prosody 提供了丰富的插件系统,允许开发者通过模块扩展其功能。Prosody 就是一个实现 XMPP 协议的服务器,它支持 XMPP 协议的标准功能,如消息传递、群组聊天、传送状态信息等,并提供了高效、可扩展的服务。

江左散人的专栏 1165

虚函数、纯虚函数、虚继承——virtual关键字的小例子

文章目录虚函数纯虚函数虚继承 虚函数 虚函数是C++的运行时多态,可以在基类中将被重写的成员函数设置为虚函数。 虚函数的作用是:当通过基类的指针或引用调用该成员函数时,将根据指针指向的对象类型确定调用的函数,而非指针的类型。 例子如下所示: 我们定义一个基类Shape,令Rectangle类继承自Shape。 我们写两个函数:outputType和outputTypeWithoutVirtual,在子类中对其进行重写。 在测试类中,我们创建一个Rectangle对象,然后使用Shape指针获取Rectan

weixin_43399489的博客 1256

Nginx反向代理HTTPS服务报错排查:The plain HTTP request was sent to HTTPS port

在Web服务架构中,反向代理是连接客户端与后端应用的关键组件,它通过转发请求实现负载均衡和安全隔离。其工作原理涉及监听端口、解析协议头部,并根据配置将请求路由至上游服务器。这一机制的技术价值在于提升系统可扩展性、简化部署,并增强安全性。在HTTPS场景下,代理服务器需正确处理SSL/TLS终止与传递,若配置不当,常引发协议不匹配问题。例如,当Nginx将解密后的HTTP请求转发至期待HTTPS的后端,或客户端直接向SSL端口发送明文请求时,便会出现经典报错“The plain HTTP request wa

weixin_33391446的博客 392

Godot4 TileMap分层绘制全攻略:解决角色、树木遮挡混乱,打造正确视觉层级

本文详细介绍了Godot4 TileMap分层绘制技术,通过图层管理和Y-Sort功能解决2D游戏中角色与物体的遮挡问题。从基础图层设置到高级优化策略,帮助开发者打造符合自然视觉规律的场景层次,提升游戏沉浸感。特别针对TileMap和TileSet的使用提供了实用技巧和代码示例。

weixin_28717411的博客 510

C++多态篇基础知识

虚函数: //什么是多态:指相同对象收到不同消息或不同对象收到相同消息时产生不同的动作 //静态多态(早绑定)/动态多态(晚绑定) #include <iostream> #include <string> using namespace std; class Rectt { public: int calcArea(int width); int calcArea...

啊sir的专栏 719

大数据领域数据建模的多源数据融合技术

在大数据时代,数据来源呈现出多样化的特点,包括企业内部的不同业务系统数据、外部的社交媒体数据、传感器数据等。这些多源数据蕴含着丰富的信息,但由于数据格式、语义、质量等方面的差异,难以直接进行分析和利用。多源数据融合技术的目的就是将这些来自不同数据源的数据进行整合、清洗、关联和统一,构建一个具有一致性和完整性的数据模型,以便更好地挖掘数据背后的价值,为企业决策、科学研究等提供有力支持。

Java大师兄的博客 1304

虚函数——virtual

virtual关键字用来 #include using namespace std; #define LOG(x) cout << x << endl; class Base { int i; public: Base(int j):i(j) { LOG("Base"); } ~Base(void) { LOG("~Base"); } int getI()

chenfeng0104的专栏 1027

基于深度学习的柠檬等级检测系统 —— YOLOv8 + UI界面 + 数据集

本项目的目标是构建一个柠檬等级检测系统,通过深度学习模型自动检测柠檬的等级。自动检测柠檬等级:通过图像中的柠檬特征,自动判断其成熟度和质量。实时视频检测:通过摄像头实时监控柠檬的质量等级。用户友好的UI界面:为用户提供简洁直观的操作界面,支持图像上传、实时视频检测等功能。本项目展示了如何基于YOLOv8模型开发一个柠檬等级检测系统,结合PyQt5实现了用户友好的UI界面。通过该系统,用户可以快速上传柠檬图像并自动识别其等级,极大提升了检测效率和准确性。数据集的扩展。

YOLO 1111

YOLOv8改进,YOLOv8添加DCNv3可变性卷积,无需编译

DCNv3在DCNv2版本上进行了改进,上一期我们在YOLOv8中添加了DCNv2,这一期我们将添加DCNv3,DCNv3代码详解可以参考链接:代码详解——可变形卷积(DCNv3)

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 5020

C++ virtual 析构函数

<br />copy自:http://zxjgoodboy.blog.sohu.com/61482463.html<br />在此基础上稍作修改<br /> <br />C++中虚析构函数的作用<br />我们知道,用C++开发的时候,用来做基类的类的析构函数一般都是虚函数。可是,为什么要这样做呢?下面用一个小例子来说明: <br />有下面的两个类:<br />#include <iostream> using namespace std; class ClxBase { public:

aore2010的专栏 9624

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

c++ 虚函数_C/C++基础语法复习(三):C++重载函数,多态,虚函数

1.重载运算符和重载函数:C++ 允许在同一作用域中的某个函数和运算符指定多个定义,分别称为函数重载和运算符重载。重载声明是指一个与之前已经在该作用域内声明过的函数或方法具有相同名称的声明,但是它们的参数列表和定义(实现)不相同。当您调用一个重载函数或重载运算符时,编译器通过把您所使用的参数类型与定义中的参数类型进行比较,决定选用最合适的定义。选择最合适的重载函数或重载运算符的过程,称为重载决策。...

weixin_39946460的博客 192

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

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

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

C++期末复习总结

后天就要考试了,自己根据自己的情况总结了一些C++的知识点。 1、C语言和C++的区别 C++是C语言的加强,以C语言为基础且完全兼容C。 C++继承了所有的C特性。2、const的区别 1)C语言中的const变量 C语言中的const变量是只读变量,有自己的存储空间 2)C++中的const常量 C++编译器对使用了ex...

nulidehahafr的博客 9086

C++基础复习

1:new的原理:a,调用operator new函数申请空间b,在申请的空间上执行自定义类型的构造函数,完成对象的构造。2:delete的原理:a,在空间上调用析构函数,完成对象中资源的清理工作b,调用operator delete函数释放对象的空间。delete p1;//想模拟上面的行为new(p2)A();//这里想当于从p2的起始位置开始开辟空间p2->~A();return 0;以上就完成了c++基础部分的复习,接下来要复习c++11的新特性和stl库。

zq3296451422的博客 1555

(C++复习笔记)多态

两函数在同一个作用域,函数名/参数相同两个函数分别在基类和派生类的作用域,函数名相同,两个基类和派生类的同名函数不构成重写就是定义。

chy00001的博客 1512

C/C++ 知识复习笔记

C/C++ 核心知识摘要

m0_63816268的博客 1953

C++ 期末超详细复习笔记

接收什么参数返回什么值具体进行了什么操作则可以放在函数的实现中完成函数的重载和返回值无关,只需要满足函数的名字相同但是参数列表不同即可并且在调用的时候不能产生歧义通过虚函数和指向子类对象的父类指针,可以把不同的子类统一视为其共同的父类。于是无需针对不同的子类写相同的代码,将其统一视作父类,比如在构建对象数组的时候,只需要一个父类的数组就能容纳所有的子类对象。本质是将虚函数的能做什么和怎么做分离出来,基类指定要做什么,子类来实现具体的做法。

kkq的博客 2682

南京大学cpp复习(c10——多态、操作符重载)

本文摘要: 多态允许同一元素在不同上下文中有多种表现形式,提高代码灵活性。实现方式包括函数重载(静态绑定)、泛型和面向对象特性。函数重载通过参数类型区分,遵循严格匹配规则避免歧义。操作符重载使自定义类型支持运算符,需遵循原有语义,部分操作符(如.)不可重载。重点介绍了双目/单目操作符重载的实现方式,以及特殊操作符=和[]的重载要点,包括深拷贝处理、三/五法则、读写控制等。强调操作符重载应保持语义一致性,避免破坏语言基础特性。

Bin二叉的博客 971

浅谈C++多态

最近复习到了C++的多态性,我想把多态性的一些知识点进行下梳理总结。本文所有代码均在windows10的VS2013平台上测试 什么是多态? 多态性(polymorphism)据说最早源自希腊语,从字面上理解就是多种形态,多种形式。具体到C++这种面向对象(OOP)的语言中,其实就是“一种接口,多种实现(方法)”。 多态可分为静态多态和动态多态,具体的分类情况如下: 静态多态和动态多态

xy913741894的博客 1万+

【C++】基础语法总结复习

对c++基础语法笔记进行整理。

越发感受自己知识的渺小,希望能够把自己遇到的问题和大家一起交流,如有不对之处,请斧正。 1202

C/C++复习之 虚函数

概念 面向对象程序设计的基本特征:抽象、封装、继承、多态 C++中,多态分为编译时的多态性和运行时的多态性。编译时的多态是通过函数重载实现的,运行时的多态是通过虚函数实现的。 虚函数是重载的另一种形式。这是一种动态的重载方式,它提供了一种更为灵活的运行时的多态机制。虚函数允许函数调用于函数体之间的联系在程序运行时才建立,也就是在程序运行时才决定函数的具体内容,即所谓的动态联编。 ...

Hello World ! 399

【C++】C++基础语法

C++基础语法呢,有非常多的细节,需要大家慢慢来摸索,仔细的回顾,反复的复习

ChaoFreeandeasy_的博客 5166

C++ 复习 :知识点 多态性与虚函数

2017-6-18    1 多态性定义,作用.为什么会引入它。 2 虚函数的定义,作用,为什么会引入它。 3 向上类型的定义,作用。 4 捆绑定义,早捆绑,晚捆绑,为什么要实现捆绑。 5 虚函数的扩展性, 6 如何实现晚捆绑,存放型信息、功能演示、。 7 抽象类和纯虚函数。 8 纯虚定义,为什么。 9 对象切片。 10 虚函数和构造函数之间的关系。 11 向下类型转换。

iSummer的专栏 620

[面试]C/C++基础知识面试题汇总

文章目录C/C++基础知识1. static关键字的作用2. C++和C的区别3. C++中四种cast转换(待补充)4.C/C++中指针和引用的区别5. C++中的智能指针6. 数组和指针的区别7. 野指针是什么8. 为什么析构函数必须是虚函数?为什么c++默认的析构函数不是虚函数9. 指针函数和函数指针(定义和初始化)10. 析构函数(若有地址)11. 静态函数和虚函数的区别12. 重载和重写13. strcpy和strlen14. 静态多态和动态多态15. 内存的几个段,堆,栈16. const限定符

weixin_44972997的博客 3154
上一篇: C语言为何到现在都是热门语言?原因很简单,程序员大牛都知道
下一篇: 程序员水平自测题:程序员们,想知道你的技术达到了什么水平吗?
CodingPs
博客等级 码龄7年 182粉丝 253原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值