C++复习之路十三——虚函数和多态

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

封装:打破了C语言函数的概念,可以将实现细节隐藏起来,使得代码模块化

继承:使得代码能够重用,提高了编程效率

多态:接口重用,在以后写代码的时候,大框架不需要改变,就能够使用之后写的代码。

二、多态的具体实现

要实现多态就必须先得有继承。我们先来看一个例子。

class Parent
{
public:
	 void print()
	{
		cout << "打印Parent的成员" << endl;
	}
};

class Son : public Parent
{
public:
	 void print()
	{
		cout << "打印Son的成员" << endl;
	}
};

我们定义了一个Parent类,这个类只有一个public的成员函数,Son类以pubic的方式继承Parent类,所以它也继承了print()函数。如果我们声明一个Son类的对象,并且让这个对象使用它的成员函数print()函数,打印出的结果为

打印Son的成员

这是因为这里出现了函数重写,将父类里面的print()函数在子类里面重新写了一遍。所以子类的对象会调用其本身的成员函数。

【注意】:函数重写必须出现在父类和子类中,且函数声明必须相同。

现在我们定义一个父类对象的指针,让其指向子类的对象,会出现什么效果呢。

Parent *p = new Son;

这样打印出来的结果是:

打印Parent的成员

但是我们希望用父类的指针指向子类的对象,并且能够执行子类的print()函数。这个时候我们就要用到c++的一大特性——多态。

我么要实现多态,只要在父类的print()函数的返回类型前面加上virtual关键字就行了,这样我们就能够打印出我们所希望的结果了。子类的print(),函数前面可以加也可以不加。加上virtual就表示这是一个虚函数。

建议:我们在用多态的时候,我们最好在子类的相应的成员函数前也加上virtual这样就能让阅读代码的人清楚的知道这个函数的作用。

我们可以这样声明Parent类:

class Parent
{
public:
	virtual void print()
	{
		cout << "打印Parent的成员" << endl;
	}
};

然后我们用Parent对象的指针指向Son类的对象,然后执行print()函数就可以打印子类中的数据了。这样就形成了多态,多态能够让我们使用未来的代码,而且还不用改变现在的框架。比如我们再从Parent类继承一个Girl类

class Girl : public Parent
{
public:
	virtual void print()
	{
		cout << "打印girl的成员" << endl;
	}
};

然后我们将Parent的对象的指针指向Girl对象,我们也可以打印“打印girl的成员",而且我们不需要改变大框架。

从上面的例子我们可以看出c++为我们提供了很多的便利,在使用多态的时候,我们可以根据不同的对象来执行一些不同的任务,并且可以很好的兼容以后的代码。

三、总结形成多态的条件

1、必须有继承

2、必须有函数的重写,即父类和子类的函数原型相同。

3、必须是通过父类的指针指向子类,或者用父类去引用子类。

【C++面向对象程序设计期末复习】——多态 为不同数据类型的实体提供统一的接口,或使用单一符号表示多种类型。 阅读详情

相关推荐

(精读)揭示多元时间序列的高阶组织

时间序列分析已经被证明是刻画生物学、神经科学和经济学中的一些现象以及理解它们的一些潜在动力学特征的有力方法。尽管针对多元时间序列的分析已经提出了很多方法,但大多数方法都忽略了非成对相互作用对涌现动力学的影响。在这里,我们提出了一个新的框架来刻画多元时间序列中高阶依赖关系的时间演化。利用网络分析和拓扑学,我们表明,与传统的基于成对统计的工具不同,我们的框架鲁棒地区分了耦合混沌映射的各种时空状态,包括混沌动力学阶段和各种类型的同步。

weixin_53406075的博客 2412

java instanceof 继承_继承_instanceOf的使用

本阶段是进入“程序员”的门槛,需要学习编程8yt基本的知识:变量、数据类型、控制 语句、面向对象。我们通过实际的案例,让大家一开始就通过游戏项目进入学习状态,寓教 于乐,引起大家的兴趣。“兴趣永远是较好的老师,高淇老师只能排第二”。 同时,我们也深入内存底层,打扎实大家的基本功。本阶段内容学完,你就明白各个语 言底层其实差异都不大。大家再去学其他编程语言也很容易入门。第一阶段:JAVA 入门本阶段...

weixin_32862641的博客 308

HFSS 3D LAOUT PCB 裁剪,差分线,过孔仿真和优化

我本身不是做天线设计的,所以HFSS这个软件给我主要还是做PCB级别的高速信号完整性仿真,一般2.5D的仿真软件无法对过孔和跨平面进行仿真。所以要借助三维电磁软件进行。今天就针对PCB进行裁剪。为什么要裁剪?以为如果把整个PCB一起仿真的话,应该要好几个月吧。所以为了加快仿真速度,必须进行裁剪仿真。①candence的PCB可以直接导入。那么先导入brd文件,file-import-candence结果如下②点击cutout,选中要仿真的net和参考平面。这里最好选creat new不然会把原文件覆盖掉。注

gjatwfn的专栏 1万+

多态的三个必要条件

多态的三个必要条件: 1、要有继承(实现implements) 2、要有重写(overWrite&overRide) 3、父类引用指向子类对像 [ 例:Object cat = new Cat(); ]

枫桥夜泊 1558

手把手教学,Python 游戏编程之实现飞机大战(含源代码)

我想大家都是有玩过类似飞机大战的射击类游戏,也享受目标被消除通过后带来的愉悦感。那么如果用Python来实现飞机大战游戏?下面就跟大家一起用Python来做一个小游戏,不仅可以从中感受到乐趣,还可以提升自己的能力。

veratata的博客 1万+

五大经典遥感数据集对比:LoveDA、Potsdam、Toronto、Vaihingen、Massachusetts Roads选哪个?

本文深度对比了LoveDA、Potsdam、Vaihingen、Toronto和Massachusetts Roads五大经典遥感数据集。针对城市监测、道路提取、土地分类等不同任务,从分辨率、标注质量、数据规模及场景多样性等核心维度进行分析,为研究者根据项目目标、硬件条件与应用场景选择最合适的遥感数据集提供决策指南。

weixin_29057065的博客 237

产生多态的三个必要条件

有继承 有重写 父类的引用指向子类的对象

haozhongjun的专栏 1550

求一个点到任意两个点所在直线距离 C#代码公式

求点C(X0,Y0) 到点A(x1,y1)和点B(x2,y2)所在直线的距离 1.已知任意两个点,求这两个点所在直线 已知点A(x1,y1),点B(x2,y2) 设直线上另外任意一个点为(x,y) 那么 (x-x1)/(y-y1) = (x2-x1)/(y2-y1); 整理后得方程: (y2-y1)x + (x1-x2)y + (y1-...

qq_29434987的博客 4492

形成多态的条件

继承或者实现【二选一】 父类引用指向子类对象【格式体现】 Animal anl = new Dog(); 方法的重写【意义体现:不重写,无意义】

baidu_39603432的博客 345

DAMMFND: Domain-Aware Multimodal Multi-view Fake News Detection

虚假新闻的泛滥不仅严重阻碍了互联网社交媒体的健康发展,还在政治、经济和社会层面造成了实际危害,凸显了自动化虚假新闻检测的重要性(Zhou 等,2015;Cui 等,2019;Zhu 等,2022a;Li 等,2024c,b,a)。现有的虚假新闻检测方法通常聚焦于特定领域的新闻,例如健康或政治领域。然而,在现实世界中,社交媒体上的新闻往往跨越多个领域,这就要求现有的虚假新闻检测方法必须考虑多域泛化(Nan 等,2021;Qi 等,2019;Zhu 等,2022b)。

qq_52053775的博客 337

大疆FPGA/芯片开发工程师(A卷)笔试题(含详解)

大疆芯片开发岗A卷 一、单选题 1.下列关于多bit数据跨时钟域的处理思路,错误的有   A、发送方给出数据,接收方用本地时钟同步两拍再使用   B、发送方把数据写到异步fifo,接收方从异步fifo里读出   C、对于连续变化的信号,发送方转为格雷码发送,接收方收到后再转为二进制   D、发送方给出数据,发送方给出握手请求,接收方收到后回复,发送方撤销数据 2.对12.918做无损定点化,需要的最小位宽是多少位,位宽选择11位时的量化误差是多少   A、12位,0.0118   B、13位,0.0039

Mr.翟的博客 2万+

【c++复习笔记】——多态详细解析,多态的原理,多态的笔试题

💂 个人主页:努力学习的少年 🤟 版权:本文由【努力学习的少年】原创、在优快云首发、需要转载请联系博主 💬 如果文章对你有帮助、欢迎关注、点赞、收藏(一键三连)和订阅专栏哦 ​

sjp11的博客 6079

基于Cesium实现,动态水面+大坝排水动画

一、绘制面状水域,使用水波纹理,进行渲染,水体透明,可以看到底色。三、使用粒子系统,将喷泉改变方向,加上重力设置,实现排水动画。二、绘制线状三维体,用作模拟大坝拦截效果。四、最后,模拟水位上升,进行淹没分析,

一醉千秋的专栏 1418

【C++】多态(C++重中之重)(学习与复习兼顾)

【C++】多态 面向对象的三大特性之首!(C++重中之重,也是C++的精髓,所以大家认真学习)(学习与复习兼顾)

Liyuyue的博客 834

PADSViewerVX.2.14.1

PADS文件查看器

uc1698中文资料高清.pdf版

uc 1968 中文

【C++】多态

众所周知,面向对象语言的三大特性就是封装继承和多态,在之前的文章中我们就介绍了继承的相关内容。这次我们一起来学习一下多态的相关内容✨✨

Lin_Alpaca的博客 1166

【最新版】 QJ 10002-2008.pdf

【最新版】 QJ 10002-2008.pdf

c++复习之多态与虚函数

多态与虚函数多态概念使用普通成员函数实现多态虚函数使用虚析构函数纯虚函数和抽象类抽象类虚基类 多态 面向对象3种机制之一(封装、继承、多态),提高程序的可读性,可扩展性和可重用性。 概念 不同对象可以调用相同名称的函数,但可导致完全不同的行为的现象。 多态实现的是接口的复用。不论传递过来是哪个类的对象,函数都能够通过同一个接口调用到适应各自对象的实现方法。 使用 编译时多态(静态多态):即函数重载,在编译时就能绑定调用语句与调用函数入口地址。 运行时多态(动态多态)函数调用与代码入口地址的绑定需要在运行时刻

guangod的博客 570

半导体专业术语(20220301205302).pdf

半导体专业术语(20220301205302).pdf

多态复习笔记 虚函数

​ 多态的概念:通俗来说,就是多种形态,具体点就是基类动物类里有一个speak函数,函数前面加了virtua成了虚函数,子类猫和狗都继承了动物类并对speak函数进行了重写(子类和父类中的虚函数拥有相同的名字,返回值,参数列表)。父类的指针或者引用指向子类:会产生不同的效果,就构成了多态多态满足条件有继承关系子类重写父类中的虚函数多态使用条件父类指针或引用指向子类对象重写:函数返回值类型 函数名 参数列表 完全一致称为重写。

Liu___l的博客 1093

C++ 多态(1): 虚函数及实现原理

C++远征之多态篇视频教程 笔记 方便自己查阅和复习,温故而知新。 目录 1虚函数及实现原理 2 代码示例1 3 代码示例2 参考资料 多态 多态指相同对象接收到不同消息或不同对象收到相同消息时产生不同的动作。 多态分为静态多态和动态多态。 (1) 静态多态也称为早绑定。 (2) 动态多态也称为晚绑定,必须以封装和继承为基础。 1虚函数及实现原理 (1...

TechArtisan6的博客 1521

C++知识复习:多态、虚函数

两个半月没更博客,人变得更菜了,开始挖个复习大坑。 1.C++的三大特性:封装、继承、多态。 2.多态:用一句话来概括,多态就是同一函数(方法)作用于不同的对象时,可以有不同的解释,产生不同的执行结果。在面向编程中使用多态,能大大提高程序的可扩充性 多态主要是为了解决很多派生类都和基类有同一个同名函数的问题,有了多态之后,编译器就可以通过判断指针指向的地址来判断运行哪一个类中的函数。 动态多态会伴随着虚函数,虚函数是在基类中使用关键字virtual声明的函数。在派生类中重新定义基类中定义的虚函数时,会告诉

没有感情的cv机器 239

C++二级复习6(多态性和虚函数)

C++二级复习6 1、多态性(面向对象): 向不同的对象发送同一个消息,不同的对象在接收时会产生不同的行为(即方法) 从系统实现的角度来看,多态性分为:静态多态性和动态多态性。 静态多态性是通过函数重载实现的,程序编译时就知道调用函数的全部信息,也被称为编译时的多态性。 动态多态性:运行时的多态性,通过虚函数实现的。 2、引入:如果用同一个成员名调用类对象的成员,会调用哪个对象的成员? 3、虚函数...

weixin_43420243的博客 374

C++复习——虚函数与多态

1. 虚函数 虚函数是应在派生类中重新定义的成员函数。 当使用指针或对基类的引用来引用派生的类对象时,可以为该对象调用虚函数并执行该函数的派生类版本。 在C++中用virtual关键字来表示。在使用继承时,基类的析构函数必须是虚函数,否则在调用析构函数的时候会出现指针错误,下述代码给出原因。 另外强调: 定义一个函数为虚函数,不代表函数为不被实现的函数。 定义他为虚函数是为了允许用基类的指针来调用子类的这个函数。 定义一个函数为纯虚函数,才代表函数没有被实现。 定义纯虚函数是为了实现一个接口,起到一个规范

Overvautious的博客 452

浅谈C++多态

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

xy913741894的博客 1万+

【C++复习】多态{深入理解多态底层}

介绍 windows下堆栈相对位置 析构函数 复习override和final和重载/重定义/重写 抽象类 多态原理 回顾虚基表指针 单继承多态底层 打印虚函数表 多继承多态底层 c++输出类成员函数地址 再次理解多态 早期绑定/晚期绑定

Ape's IT Blog 1072

C++彻底搞定面试--多态篇,博主呕心沥血之作,万字解析,弄透多态

本篇文章帮助同学们彻底解决多态 1.多态的实现 2.多态的底层 3.多态经典面试题 等等,期待前来观看

龟龟的博客 2417

(C++复习笔记)多态

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

chy00001的博客 1513
上一篇: C++复习之路十二——类继承的构造函数和析构函数执行的顺序问题
下一篇: C和C++面试秘笈一——C和C++程序基础
技术小白yhx
博客等级 码龄10年 443粉丝 67原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值