C++之多态使用小结

1、多态定义

1.1 多态概念     

        C++多态性(Polymorphism)是面向对象编程(OOP)的一个重要特性之一,它允许我们使用统一的接口来处理不同类型的对象。多态性使得程序更加灵活、可扩展并且易于维护。

       通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态

1.2 多态的构成条件

       多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。对于同一行为买票(BuyTicket)比如,由于Student继承了Person。Person对象买票全价,Student对象买票半价。
  在继承中要构成多态还有两个条件:

  • 必须通过基类的指针或者引用调用虚函数。
  • 被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写

2、多态的使用

2.1 虚函数

      构成多态的条件中提到了虚函数,所谓的虚函数,就是被virtual修饰的类成员函数。具体如下,函数BuyTicket()即为虚函数。其中只要在申明时添加virtual关键字,在具体实现虚函数方法时不需要添加。

class Person {
public:
	virtual void BuyTicket();
};
void Person::BuyTicket()
{
	cout << "买票-全价" << endl;
}

2.2 虚函数的重写

      虚函数的重写(覆盖):派生类中有一个跟基类完全相同的虚函数(即派生类虚函数与基类虚函数的返回值类型、函数名字、参数列表完全相同),称子类的虚函数重写了基类的虚函数。我们看如下例子派生类Student对虚函数BuyTicket() 进行了重写。

class Person {
public:
	virtual void BuyTicket();
};
void Person::BuyTicket()
{
	cout << "买票-全价" << endl;
}

class Student : public Person {
public:
	void BuyTicket();
};
void Student::BuyTicket()
{
	cout << "买票-半价" << endl;
}

3、多态练习

3.1 派生构造函数使用

      派生函数在使用基类中成员变量的同时,再添加成员变量,这种情况用法可参考如下案例。基类Person中包括成员变量:name、age、gender。派生类Student又添加成员变量:id、score。那么,在构造函数中,使用如下命令,其中name、age、gender为继承People,id、score为赋值。

Student::Student(string name, int age, string gender, string id, int score) : People(name, age, gender), id(id), score(score)
{}
#include <iostream>
#include<string>
using namespace std;
class People
{
public:
	People();
	People(string name, int age, string gender);
	~People();
	void PrintInfo();

public:
	string name;//姓名
	int age;//年龄
	string gender;//性别

};

People::People(string name, int age, string gender)
{
	this->name = name;
	this->age = age;
	this->gender = gender;
}
void People::PrintInfo()
{
	cout << "name :" << this->name << endl; 
	cout << "age :" << this->age << endl;
	cout << "gender :" << this->gender << endl;
}

People::People()
{
}

People::~People()
{
}

class Student :public People
{
public:
	Student();
	Student(string name, int age, string gender, string id, int score);
	~Student();
	void PrintInfo();

public:
	string id;
	int score;

};
Student::Student(string name, int age, string gender, string id, int score) : People(name, age, gender), id(id), score(score)
{}

void Student::PrintInfo()
{
	cout << "name :" << this->name << endl;
	cout << "age :" << this->age << endl;
	cout << "gender :" << this->gender << endl;
	cout << "id :" << this->id << endl;
	cout << "score :" << this->score << endl;
}

Student::Student()
{
}

Student::~Student()
{
}

3.2 案例一:

      下面介绍对这句话的理解:基类的指针引用或者调用调用虚函数

其可以这样理解:

(1)如果指针指向基类地址,那么只能访问基类的虚函数

(2)如果指针指向派生类地址,那么只能访问派生类中与基类对应的函数

#include <iostream>
#include<string>
using namespace std;
class Person
{
public:
	virtual void BuyTicket()
	{
		cout << "买票-全价" << endl;
	}
};
class Student : public Person
{
public:
	virtual void BuyTicket()
	{
		cout << "买票-半价" << endl;
	}
};
void Func(Person& p)
{
	p.BuyTicket();
}
int main()
{
	Person ps;
	Student st;
	Func(ps);
	Func(st);
	system("pause");
	return 0;
}

       上述代码构成了多态吗?首先是虚函数BuyTicket(),其次完成了重写。结果如下,原因是ps对应的是基类指针,因此只能访问基类的BuyTicket()函数;而st对应的是派生类指针,因此访问派生类的BuyTicket()函数。

3.3 案例二:

#include <iostream>
#include<string>
using namespace std;
class A
{
public:
	virtual void func(int val)
	{
		cout << "A->" << val << std::endl;
	}
};

class B : public A
{
public:
	virtual void func(int val)
	{
		cout << "B->" << val << std::endl;
	}
};

int main()
{
	A* p = new B;
	p->func(1);
	system("pause");
	return 0;
}

       上述的代码调用构成多态吗?首先是虚函数func(),其次完成了重写上述代码中,p指针是指向派生类B地址,因此,只能访问B对应的func()函数,是B->1

3.4 案例三:

#include <iostream>
#include<string>
using namespace std;
class A
{
public:
	virtual void func(int val = 1)
	{
		std::cout << "A->" << val << std::endl;
	}
	virtual void test()
	{
		func();
	}
};

class B : public A
{
public:
	void func(int val = 0)
	{
		cout << "B->" << val << std::endl;
	}
};

int main(int argc, char* argv[])
{
	B*p = new B;
	p->test();
	system("pause");
	return 0;
}

在 B 类的 func 函数中,有一个默认参数值为 0,这意味着当 test 函数被调用时,它会使用这个默认值。然而,test 函数中有一个显式的调用 func(),这意味着它会调用 B 类中的 func 实现,并传递参数 1

参考博客:

【1】【C++】多态(举例+详解,超级详细)_c++多态-CSDN博客

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

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

相关文章

Java小白入门到实战应用教程-开发环境搭建-IDEA2024安装激huo详细教程

writer:eleven 安装IDEA2024 一、下载IDEA 推荐大家去官网下载 我这里也给大家直接准备了安装包&#xff0c;和激huo教程&#xff0c;大家可以自行下载使用。 注意&#xff1a;激huo教程只用于学习交流&#xff0c;不可商用。 IDEA2024安装包及激huo教程 说明&#xff1a…

stm32入门-----初识stm32

目录 前言 ARM stm32 1.stm32家族 2.stm32的外设资源 3.命名规则 4.系统结构 5.引脚定义 6.启动配置 7.STM32F103C8T6芯片 8.STM32F103C8T6芯片原理图与最小系统电路 前言 已经很久没跟新了&#xff0c;上次发文的时候是好几个月之前了&#xff0c;现在我是想去学习st…

35 解决单条链路故障问题-华三链路聚合

InLoopBack接口是一种虚拟接口。InLoopBack接口由系统自动创建&#xff0c;用户不能进行配置和删除&#xff0c;但是可以显示&#xff0c;其物理层和链路层协议永远处于up状态。InLoopBack接口主要用于配合实现报文的路由和转发&#xff0c;任何送到InLoopBack接口的IP报文都会…

zigbee开发工具:3、驱动安装与程序下载(更新中...)

zigbee开发工具前两篇讲解了IAR开发工具的安装与注册&#xff0c;还介绍了新建一个cc2530开发工程的建立与配置。在进行zigbee开发&#xff0c;代码编写编译好后还需要下载到zigbee节点设备上进行调试与验证&#xff0c;那么就需要安装SmartRF Flash Programmer软件 和仿真器等…

Vim使用教程

目录 引言1. Vim的基本概念1.1 模式1.2 启动和退出 2. 基础操作2.1 导航2.2 插入文本2.3 删除和复制2.4 查找和替换 3. 高级功能3.1 多文件编辑3.2 宏录制和执行3.3 使用插件3.4 自定义快捷键 4. Vim脚本和自定义配置4.1 基本配置4.2 编写Vim脚本 5. 实用技巧5.1 快速移动5.2 批…

基于复旦微JFMQL100TAI的全国产化FPGA+AI人工智能异构计算平台,兼容XC7Z045-2FFG900I

基于上海复旦微电子FMQL45T900的全国产化ARM核心板。该核心板将复旦微的FMQL45T900&#xff08;与XILINX的XC7Z045-2FFG900I兼容&#xff09;的最小系统集成在了一个87*117mm的核心板上&#xff0c;可以作为一个核心模块&#xff0c;进行功能性扩展&#xff0c;能够快速的搭建起…

Golang | Leetcode Golang题解之第233题数字1的个数

题目&#xff1a; 题解&#xff1a; func countDigitOne(n int) (ans int) {// mulk 表示 10^k// 在下面的代码中&#xff0c;可以发现 k 并没有被直接使用到&#xff08;都是使用 10^k&#xff09;// 但为了让代码看起来更加直观&#xff0c;这里保留了 kfor k, mulk : 0, 1;…

Dify中的weaviate向量数据库操作

一.安装weaviate客户端 1.Dify 0.6.9中weaviate信息 在Dify 0.6.9版本中weaviate容器信息如下: # The Weaviate vector store. weaviate:image: semitechnologies/weaviate:1.19.0restart: alwaysvolumes:# Mount the Weaviate data directory to the container.- ./volume…

数据结构(空间复杂度介绍)超详细!!!

1. 数据结构前言 1.1 数据结构 数据结构是计算机存储、组织数据的形式&#xff0c;指相互之间存在一种或多种特定关系的数据元素的集合 1.2 算法 算法&#xff1a;良好的计算过程&#xff0c;它取一个或一组的值为输入&#xff0c;并产生出一个或一组的值作为输出。即算法经…

初学SpringMVC之 Ajax 篇

Ajax&#xff08;Asynchronous JavaScript and XML&#xff09;是一种在无需重新加载整个网页&#xff0c;能够更新部分网页的技术 Ajax 不是编程语言&#xff0c;而是一种用于创建更好更快以及交互性更强的 Web 应用程序技术 使用 Ajax 技术的网页&#xff0c;通过在后台服务…

课程设计——Python+OpenCV数字图像处理[车牌识别]

Python opencv 车牌识别 数字图像处理课程设计作业Python3OpenCV使用tkinter搭建界面tmp/文件夹是数字图像处理过程chepai/文件夹是车牌图片pic/文件夹是程序界面图PPT文件是验收时要讲的程序是从网上学习的并自己弄的&#xff0c;不完善&#xff0c;识别率不高 开发环境配置…

jenkins系列-09.jpom构建java docker harbor

本地先启动jpom server agent: /Users/jelex/Documents/work/jpom-2.10.40/server-2.10.40-release/bin jelexjelexxudeMacBook-Pro bin % sh Server.sh start/Users/jelex/Documents/work/jpom-2.10.40/agent-2.10.40-release/bin jelexjelexxudeMacBook-Pro bin % ./Agent.…

OpenCV图像处理——判断轮廓是否在圆环内

要判断一个轮廓是否在圆环内&#xff0c;可以将问题分解为两个步骤&#xff1a; 确保轮廓的所有点都在外圆内。确保轮廓的所有点都在内圆外。 下面是一个完整的示例代码&#xff0c;展示如何实现这一点&#xff1a; #include <opencv2/opencv.hpp> #include <iostr…

pytorch-LSTM

目录 1. RNN存在的问题2. LSTM的由来3. LSTM门3.1 遗忘门3.2 输入门3.3 输出门 4. LSTM是如何减轻梯度弥散问题 1. RNN存在的问题 如下图&#xff1a;RNN能满足预测下一个单词&#xff0c;但是对于获取更多的上下文信息就做不到了。 2. LSTM的由来 RNN能做到短时记忆即shor…

开发业务(2)——wordpress使用基础教程

外贸领域里面wordpress是比较通用的框架。由于多年的发展&#xff0c;性能和插件非常强大&#xff0c;包括支持各种企业站&#xff08;很多人已经设计了各种风格&#xff0c;只需要你将对应主题风格安装即可&#xff0c;当然也有付费的&#xff09;。这导致其内部生态非常强大&…

2024年上半年信息系统项目管理师——综合知识真题题目及答案(第1批次)(4)

2024年上半年信息系统项目管理师 ——综合知识真题题目及答案&#xff08;第1批次&#xff09;&#xff08;4&#xff09; 第61题&#xff1a;The project manager should use &#xff08;tool for the purpose to report on the work remaining for projects. A. cumulativ…

<数据集>夜间车辆识别数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;5000张 标注数量(xml文件个数)&#xff1a;5000 标注数量(txt文件个数)&#xff1a;5000 标注类别数&#xff1a;8 标注类别名称&#xff1a;[car, pedestrian, traffic light, traffic sign, bicycle, bus, truck…

编写商品列表和商品编辑和商品新增页面

addvue <template><!-- 传过来的id --> <!-- {{ $route.query.id }} --> <el-formref"FormRef"style"max-width: 600px":model"FormData":rule"rules"status-iconlabel-width"auto"class"demo-r…

手机数据恢复篇:如何从 Android 手机恢复消失的照片

丢失 Android 手机中的照片现在已成为您可能遇到的最糟糕的情况之一。随着手机在相机方面越来越好&#xff0c;即使是那些不热衷于拍照的人也成为了摄影师。 如今&#xff0c;人们可以随时随地拍摄照片&#xff0c;每一张照片都保存着回忆和数据&#xff0c;因此&#xff0c;丢…

Gitea 仓库事件触发Jenkins远程构建

文章目录 引言I Gitea 仓库事件触发Jenkins远程构建1.1 Jenkins配置1.2 Gitea 配置引言 应用场景:项目部署 I Gitea 仓库事件触发Jenkins远程构建 Gitea支持用于仓库事件的Webhooks 1.1 Jenkins配置 高版本Jenkins需要关闭跨域限制和开启匿名用户访问 在Jenkins启动前加入…