【C++精简版回顾】16.虚函数,多态

news2024/11/15 10:30:58

1.虚函数与多态

以下为AI生成

        虚函数是C++中实现多态性的一种机制。多态性允许一个类的对象可以以多种不同的方式工作,即同一个函数可以根据对象的不同类型表现出不同的行为

        在C++中,通过在基类中声明虚函数,并在派生类中进行重写,可以实现多态性。当通过基类指针或引用调用虚函数时,会根据指针或引用所指向的对象的实际类型来确定调用哪个类的虚函数。

以下是虚函数与多态的一些关键点:

  1. 虚函数:在基类中使用virtual关键字声明的成员函数被称为虚函数。派生类可以对虚函数进行重写,实现自己的版本。
  2. 动态绑定:通过基类指针或引用调用虚函数时,会根据指针或引用所指向的对象的实际类型来确定调用哪个类的虚函数。这种在运行时确定函数调用的机制称为动态绑定。
  3. 纯虚函数:在基类中使用virtual关键字声明且没有实现的函数被称为纯虚函数。纯虚函数必须在派生类中进行重写才能创建对象。
  4. 虚析构函数:当基类指针指向派生类对象并通过该指针删除对象时,如果基类的析构函数不是虚函数,将只会调用基类的析构函数,而不会调用派生类的析构函数。为了确保正确释放派生类对象的资源,需要将基类的析构函数声明为虚函数。

虚函数函数与多态 

        对于我来说,虚函数就是函数前面加virtual,多态就是子类重写父类虚函数。

1.class People

class People {
public:
	static int a;
	People() {}
	virtual void print() {
		cout<<"调用People的函数" << endl;
	}
};
int People::a = 1;

2.class MM

class MM :public People {
public:
	MM() {}
	MM(int age,string name):age(age),name(name) {}
	void print() {
		cout << "调用MM的函数" << endl;
		//说明static变量也可以继承
		cout << "静态变量:"<<a<< endl;
	}
private:
	int age;
	string name;
};

3.main

int main() {
	MM mm(10,"网");
	mm.print();
	return 0;
}

结果:

2.抽象类,纯虚函数

        纯虚函数:virtual void print()=0; 注意后面要等于0

        抽象类:类中全为纯虚函数

        你是公司的底层程序员,那么就是你继承抽象类然后实现。。牛马的一生。

1.class People

class People {//抽象类
public:
	virtual void print() = 0;
	virtual void print1() = 0;//纯虚函数
};

2.class MM

class MM :public People{
public:
	void print() {
		cout<<"调用print函数" << endl;
	}
	void print1() {
		cout << "调用print1函数" << endl;
	}
	~MM() {
		cout << "调用MM析构函数" << endl;
	}
};

3.main

int main() {
	MM mm;
	mm.print();
	mm.print1();
	return 0;
}

结果:

补充:使用new创建

1.new创建不delete

        结果:不调用析构函数


2.new创建delete

        结果:调用析构函数

3.虚析构函数

1.class People

class People {//抽象类
public:
	~People() {
		cout << "调用People析构函数" << endl;
	}
	virtual void print() = 0;//纯虚函数
};

2.class MM:public People

class MM :public People{
public:
	MM() {}
	~MM() {
		cout << "调用MM析构函数" << endl;
	}
	void print() {}
};

3.main

(1)MM* mm=new MM;

int main() {
	MM* mm=new MM;
	//释放
	delete mm;
	mm = nullptr;
	return 0;
}

(2)People* mm=new MM;这是多态的写法,基类指针指向派生类对象并通过该指针删除对象时,如果基类的析构函数不是虚函数,将只会调用基类的析构函数,而不会调用派生类的析构函数。

        显然有错,使用MM(子类)来创建People(父类)对象,在析构的时候没有析构子类,解决方法是使用virtual修饰People(父类)的析构函数。如(3)

int main() {
	People* mm=new MM;
	//释放
	delete mm;
	mm = nullptr;
	return 0;
}

(2)People* mm=new MM;

int main() {
	People* mm=new MM;
	//释放
	delete mm;
	mm = nullptr;
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1484311.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

外贸福利 PHP源码 WhatsApp 营销 - 批量发件人、聊天、机器人、SaaS 搭建

WhatsApp 营销工具对于外贸人员来说至关重要。随着全球贸易的不断发展&#xff0c;WhatsApp已成为了许多国际贸易商之间沟通的首选工具之一。通过利用WhatsApp营销工具&#xff0c;外贸人员可以轻松地与客户建立联系&#xff0c;传递产品信息&#xff0c;进行价格谈判&#xff…

分销小程序的常见功能

分销小程序是一种非常有前景和潜力的产品形式&#xff0c;可以帮助企业快速拓展销售渠道&#xff0c;增加销售额。下面我将介绍分销小程序的常见功能。 1. **分销商注册与管理**&#xff1a;支持任何用户自动成为分销商&#xff0c;也可以支持有会员等级&#xff08;或付费或审…

C# OpenVINO Crack Seg 裂缝分割 裂缝检测

目录 效果 模型信息 项目 代码 数据集 下载 C# OpenVINO Crack Seg 裂缝分割 裂缝检测 效果 模型信息 Model Properties ------------------------- date&#xff1a;2024-02-29T16:35:48.364242 author&#xff1a;Ultralytics task&#xff1a;segment version&…

鸿蒙Harmony应用开发—ArkTS声明式开发(通用属性:颜色渐变)

设置组件的颜色渐变效果。 说明&#xff1a; 从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 linearGradient linearGradient(value: { angle?: number | string; direction?: GradientDirection; colors: Array; repea…

2024年3月5-7日年生物发酵装备展-环科环保科技

参展企业介绍 山东环科环保科技有限公司,是一家集环保设备的设计、制造、安装、服务及环境治理工程总承包于一体的企业。 公司长期专注于大气、水、危固废三大领域&#xff0c;以科技创造碧水蓝天&#xff0c;为客户提供环保解决方案。 以稳定的产品及服务质量、适用的技术、…

游戏科技:超越娱乐的界限

12月25日&#xff0c;国家新闻出版署在节日前夕推出令业内人士振奋的好消息——本次共有105款国产网络游戏通过审批&#xff0c;获得版号&#xff0c;这不仅数量超过了历史新高&#xff0c;更使业内人士看到政策回暖的希望。 这105款游戏覆盖多家知名游戏企业&#xff0c;其中不…

SketchUp Pro 2023:颠覆传统,重塑设计世界mac/win版

SketchUp Pro 2023是一款强大的三维建模软件&#xff0c;专为设计师、建筑师和创意专业人士打造。这款软件以其直观易用的界面和强大的功能而著称&#xff0c;为用户提供了无限的创意空间。 SketchUp Pro 2023软件获取 SketchUp Pro 2023在用户体验方面进行了全面的优化&#…

ABAP - SALV教程03 - 开篇:打开SALV的三种方式之三

全屏模式生成SALV的方式&#xff1a;http://t.csdnimg.cn/CzNLz可控模式生成SALV的方式&#xff1a;http://t.csdnimg.cn/zB7tuDocking container生成SALV的方式&#xff0c;需要在屏幕的PBO或者屏幕初始化事件里完成。完整代码 TABLES:vbak.CLASS lcl_model DEFINITION.PUBLIC…

取送货问题(Pickup and Delivery Problem)

取送货问题及其变体 广义取送货问题&#xff08;General Pickup and Delivery Problems&#xff0c;GPDP&#xff09;可以分为两类&#xff1a; Vehicle Routing Problems with Backhauls&#xff0c;VRPB&#xff1a;从配送中心&#xff08;depot&#xff09;取货运输货物到客…

buuctf misc做题笔记

喵喵喵 使用stegsolve.jar&#xff0c;按BGR顺序提取出一个png图片&#xff0c;是一个只显示一半的二维码&#xff0c;修改图片高度显示全部二维码&#xff0c;解析出一个百度网盘地址&#xff0c;https://pan.baidu.com/s/1pLT2J4f 下载得到压缩包flag.rar。解压成功&#xf…

latex小技巧

目录 如何输入"I"、“II”、“III”、“IV”等大小写罗马数字。 注释&#xff08;单行/多行&#xff09; 单行注释&#xff1a;直接“%” 多行注释&#xff1a; 在TeXstudio: 如何输入"I"、“II”、“III”、“IV”等大小写罗马数字。 \uppercase\expa…

vscode——本地配置(C和C++环境配置)(2)

vscode——本地配置&#xff08;2&#xff09; 配置C语言编译看看.json文件编译多个C文件C/C调试 今天我们继续来看vscode的配置&#xff0c;如果没看过上一次的文章&#xff0c;大家可以点击&#xff1a; https://blog.csdn.net/qq_67693066/article/details/136315696 配置C语…

19.2 DeepMetricFi:基于深度度量学习改进Wi-Fi指纹定位

P. Chen and S. Zhang, "DeepMetricFi: Improving Wi-Fi Fingerprinting Localization by Deep Metric Learning," in IEEE Internet of Things Journal, vol. 11, no. 4, pp. 6961-6971, 15 Feb.15, 2024, doi: 10.1109/JIOT.2023.3315289. 摘要 Wi-Fi RSSI指纹定位…

Docker的基础知识与应用技巧

文章目录 一.docekr简介二.docekr安装三.docker命令 一.docekr简介 Docker是一个开源的应用容器引擎&#xff0c;它可以让开发者打包他们的应用以及依赖包到一个可移植的镜像中&#xff0c;然后发布到任何流行的Linux或Windows操作系统的机器上。Docker基于轻量级虚拟化技术&a…

H3C IS-IS基本配置实验

H3C IS-IS基本配置实验 实验拓扑 ​​ 实验需求 按照图示配置IP地址按照图示分区域配置 IS-IS&#xff0c;完成全网互通&#xff0c;NET 地址如图所示要求 R1 和 R2/R3 只建立 Level-1 邻接关系要求 R2 和 R3 只建立 Level-1 邻接关系按照图示修改各链路 Cost在 R2 和 R3 上…

【Word如何在表格和标题中间插入一行】

目的&#xff1a;主要是为了满足文件设计需求&#xff0c;标题前面要空出一行 操作步骤&#xff1a; 1、将鼠标光标停在标题行的最前方&#xff0c;点击回车&#xff0c;就会在表格和标题中间插入一行空白标题行。 2、因为空白标题行会影响目录的生成&#xff0c;所以将空白行…

算法修炼-动态规划之路径问题(1)

62. 不同路径 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a;选定一个网格为终点&#xff0c;走到这个网格的所有走法就是这个网格的上面一个网格的所有走法加上这个网格左边一个网格的所有走法&#xff0c;然后做好初始化工作就行。 class Solution { public:int…

《热辣滚烫》:用坚持不懈开启逆境中的职场出路

"你只活一次&#xff0c;所以被嘲笑也没有关系&#xff0c;想哭也没有关系&#xff0c;失败更没有关系。" “人生就像一场拳击赛&#xff0c;你站不起来&#xff0c;就永远不知道自己有多强” “命运只负责洗牌&#xff0c;出牌的永远是自己。” 在今年的贺岁档电影市…

JavaScript-关于事件、事件流(捕获、冒泡)、事件源、常用事件

1.如何注册事件(如何绑定事件) ​ 何为注册事件&#xff0c;就是给元素添加事件&#xff0c;其方式有传统注册事件、方法监听注册事件。 0、1级事件&#xff08;传统注册事件&#xff09;不允许多个响应程序 我们在元素内或js内使用on的方式就是传统注册事件&#xff0c;这种形…

【机器学习】包裹式特征选择之递归特征消除法

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;机器学习 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进…