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

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.mfbz.cn/a/422911.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vue3+vite打包后页面空白问题

vite.config.js vite.config.js 增加 base: ./ import { fileURLToPath, URL } from node:url import { defineConfig } from vite import vue from vitejs/plugin-vue// https://vitejs.dev/config/ export default defineConfig({base: ./,resolve: {alias: {: fileURLToPath…

【机器学习】CIFAR-10数据集简介、下载方法(自动)

【机器学习】CIFAR-10数据集简介、下载方法(自动) &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1f448; 希望得到您的订阅和支…

【C++庖丁解牛】类与对象

&#x1f4d9; 作者简介 &#xff1a;RO-BERRY &#x1f4d7; 学习方向&#xff1a;致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f4d2; 日后方向 : 偏向于CPP开发以及大数据方向&#xff0c;欢迎各位关注&#xff0c;谢谢各位的支持 目录 1.面向过程和面向对象…

jmeter 性能测试工具的使用(Web性能测试)

1、下载 该软件不用安装&#xff0c;直接解压打开即可使用。 2、使用 这里就在win下进行&#xff0c;图形界面较为方便   在目录apache-jmeter-2.13\bin 下可以见到一个jmeter.bat文件&#xff0c;双击此文件&#xff0c;即看到JMeter控制面板。主界面如下&#xff1a; 3、创…

TypeScript08:在TS中使用模块化

前言&#xff1a;tsconfig.json中的配置 一、前端领域中的模块化标准 前端领域中的模块化标准有&#xff1a; ES6、commonjs、amd、umd、system、esnext 二、 TS中如何书写模块化语句 TS 中&#xff0c;导入和导出模块&#xff0c;统一使用 ES6 的模块化标准。 myModule.ts &a…

2024全国水科技大会暨减污降碳协同增效创新与实践论坛(八)

召集人&#xff1a;王洪臣 中国人民大学环境学院教授 姚 宏 北京交通大学教授 为大会征集“绿色低碳污水厂案例”&#xff0c;欢迎各相关单位积极报名&#xff01; 一、会议背景 生态环境部、国家发展和改革委员会等七部门印发《减 污降碳协同增效实施方案》中明确提出推进水…

springboot+vue+mysql项目使用的常用注解

实体类常用注解 Data Data 是一个 Lombok 提供的注解&#xff0c;使用 Data 注解可以简化代码&#xff0c;使代码更加简洁易读。 作用&#xff1a;自动为类生成常用的方法&#xff0c;包括 getter、setter、equals、hashCode 和 toString 等需要加Lombok的依赖 <depende…

php连接hdfs初步探索

一、phdfs拓展 结果&#xff1a;暂时舍弃 安装此拓展时&#xff0c;无法make成功&#xff0c;因为缺少hdfs.n文件。 换了其他版本的拓展包&#xff0c;并编译都没有找到此文件。 后搜到官网的相关资料&#xff0c;此hdfs.h的文件路径的地址是$HADOOP_HDFS_HOME/include/hdfs…

探索数据宇宙:深入解析大数据分析与管理技术

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua&#xff0c;在这里我会分享我的知识和经验。&#x…

springboot基于保信息学科平台系统设计与实现论文

基于保密信息学科平台系统 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了基于保密信息学科平台系统的开发全过程。通过分析基于保密信息学科平台系统管理的不足&#xff0c;创建了一个计算机管理基于保密信息…

使用 Azure 部署静态网页

Author&#xff1a;AXYZdong 硕士在读 工科男 有一点思考&#xff0c;有一点想法&#xff0c;有一点理性&#xff01; 定个小小目标&#xff0c;努力成为习惯&#xff01;在最美的年华遇见更好的自己&#xff01; CSDNAXYZdong&#xff0c;CSDN首发&#xff0c;AXYZdong原创 唯…

配置MySQL与登录模块

使用技术 MySQL&#xff0c;Mybatis-plus&#xff0c;spring-security&#xff0c;jwt验证&#xff0c;vue 1. 配置Mysql 1.1 下载 MySQL :: Download MySQL Installer 1.2 安装 其他页面全选默认即可 1.3 配置环境变量 将C:\Program Files\MySQL\MySQL Server 8.0\bin…

日志到filebeat-->logstash-->elastic-->kibana

1、日志到filebeat。 cat /etc/filebeat/filebeat.yml filebeat.inputs: - type: syslog format: rfc3164 protocol.udp: host: "0.0.0.0:514" output.logstash: hosts: ["localhost:5044"] 验证方式: tcpdump -i 网卡名称 udp port 514 2、…

three.js 点乘判断平行向量方向异同

效果&#xff1a; 代码&#xff1a; <template><div><el-container><el-main><div class"box-card-left"><div id"threejs"></div><div>判断的前提是两个向量平行<el-button click"judge"…

基于zemax的激光合束过程分析

系统里的透镜包括FAC/SAC及球面聚焦镜都是采用市面上标准的透镜&#xff0c;在典型的光纤耦合14针蝶形封装中&#xff0c;最多需要三个独立的透镜才能提供有效且稳定的耦合。大多数高端激光二极管使用两个交叉的柱面方形微透镜来补偿激光二极管快轴和慢轴的发散角之间的差异。第…

顶易海关数据怎么做获客?功能详解看这里!

顶易海关数据怎么做获客呢&#xff1f;详解看这里&#xff01; 海关数据系统登录&#xff1a;hg.smtso.com/?iEF6DCB 如果对开发国外优质客户感兴趣的话&#xff0c;关注Felicia外贸说&#xff0c;一键开发客户不是问题。 海关数据主要功能&#xff1a; 报关单详情查询&#…

【监督学习之支持向量机(SVM)】

曾梦想执剑走天涯&#xff0c;我是程序猿【AK】 目录 简述概要知识图谱基本原理支持向量线性SVM与非线性SVM优化问题软间隔与正则化SVM的应用实现 简述概要 了解监督学习-支持向量机&#xff08;SVM&#xff09; 知识图谱 支持向量机&#xff08;Support Vector Machine&…

【前端素材】推荐优质后台管理系统网页Star admin平台模板(附源码)

一、需求分析 1、系统定义 后台管理系统是一种用于管理和控制网站、应用程序或系统的管理界面。它通常被设计用来让网站或应用程序的管理员或运营人员管理内容、用户、数据以及其他相关功能。后台管理系统是一种用于管理网站、应用程序或系统的工具&#xff0c;通常由管理员使…

灯塔:CSS笔记

CSS&#xff1a;层叠样式表 所谓层叠 即叠加的意思&#xff0c;表示样式可以一层一层的层叠覆盖 css写在style标签中&#xff0c;style标签一般写在head标签里面&#xff0c;title标签下面 <!DOCTYPE html> <html lang"en"> <head><meta cha…