C++ 继承与多态的基本用法

news2024/10/6 18:21:38

目录

1.继承

1.1访问等级

1.2函数遮蔽

2.多态

2.1虚函数


1.继承

有父类,有子类,这种层次关系就叫继承,也就说说子类能从父类哪里继承很多东西,继承这种概念或性质是面向对象程序设计的核心思想之一。

这种继承需要先定义一个父类,父类中主要是定义一些公共的成员变量成员函数,然后通过继承这个父类来构建新的类,这个新的类就叫做子类通过继承父类中有很多成员变量和成员函数就自动继承到了子类中,那么在书写子类的时候就减少了很多代码工作量——只用写子类独有的一些内容即可。

我们先定义一个父类里面包含一个成员变量和成员函数代码如下:

class base
{
public:
	void base_fun()
	{
		cout << "base" << endl;
	}
	int a = 10;
};

在定义一个子类对象里面包含子类的成员函数子类以public继承父类(下面会详细总结)

class son:public base//继承方式
{
public:
	void son_fun()
	{
		cout << "son" << endl;
	}
};

我们创建一个子类对象也是能够调用父类函数和变量的。(访问等级允许的情况下)。注意程序是先调用父类构造函数再调用子类构造函数

int main()
{
	son son1;
	son1.base_fun();//打印base
	cout << son1.a << endl;;//打印10
	return 0;
}

1.1访问等级

public:可以被任意实体访问
protected:只允许本类或子类的成员函数来访问
private:只允许本类成员函数访问

下面是访问权限与继承方式总结:

父类中的访问权限子类继承父类的继承方式子类得到的访问权限
publicpublicpublic
protectedpublicprotected
privatepublic子类无权访问
publicprotectedprotected
protectedprotectedprotected
privateprotected子类无权访问
publicprivateprivate
protectedprivateprivate
privateprivate子类无权访问

总结:

1.子类public继承父类,则父类所有成员在子类中的访问权限都不会发生改变;

2.protected继承将父类中的public成员变为子类的protected成员;

3.private继承使得父类所有成员在子类中的访问权限变为private;

4.父类中的private继承成员不受继承方式的影响,子类永远无权访问;

5.对于父类来讲,尤其是父类成员函数,如果你不想让外面访问,就设置为private;如果你想让自己的子类能够访问,就设置为protected,如果你想公开,就设置为public。

1.2函数遮蔽

在C++继承中,子类会遮蔽父类中的同名函数,无论此函数的返回值,参数。也就是说父类和子类中的函数只要名字相同,子类中的函数就会遮蔽掉父类中的同名函数。

当父类与子类函数重名时可以加父类作用域来调用父类函数:

int main()
{
	son son1;
	son1.fun();//打印son
	son1.base::fun();//打印base
	return 0;
}

 

2.多态

父类指针可以new一个子类对象,但是子类指针不可以new一个父类对象代码如下:

	base* base1 = new son;//可以
	son son1 = new base;//报错

很显然我们想通过父类指针new一个子类对象来调用子类同名函数,但是事实上是不可以的。这样来说就比较离谱了,我们该怎么利用父类指针调用子类同名函数呢?下面引出虚函数的概念。

2.1虚函数

在父类中,这个成员函数的声明的开头我们加上virtual关键字就可以把该函数设置为虚函数。子类同名函数前也可以加上virtual关键字(不加也可以)因为当父类同名函数被置为虚函数之后子类同名函数自动变为虚函数。

class base
{
public:
	virtual void fun()
	{
		cout << "base" << endl;
	}
	int a = 10;
};
class son:public base
{
public:
	virtual void fun()
	{
		cout << "son" << endl;
	}
};
int main()
{
	base* base1 = new son;//可以
	base1->fun();//打印son
	delete base1;
	return 0;
}

用父类指针来调用一个虚成员函数时,执行的是动态绑定的fun函数,什么叫动态绑定呢?所谓动态其实就是在程序运行的时候(运行到调用fun函数这行代码时)才能知道调用的是哪个子类的fun函数,虚函数因为是在程序运行的时候才知道调用的是哪个虚函数,所以虚函数必须写它的定义部分(以备编译器随时调用)。

以上就是全部内容了,感谢大家观看~

 

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

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

相关文章

TS类型断言、函数重载踩过的坑

任意属性 interface Person {name: string;age?: number;[propName: string]: string;//报错 } let tom: Person {name: Tom,age: 25,gender: male }; 任意属性需要包含确定属性和可选属性的类型&#xff1a;[propName: string]: string|number; 类型断言 &#x1f449;在…

zabbix企业级监控(监控第二台linux服务器安装部署)接上篇单台监控文章操作

zabbix企业级监控监控linux主机 目录 【agent端配置】&#xff08;监控第二台linux服务器&#xff09; 1、源码安装zabbix&#xff08;解包、编译、配置、安装&#xff09; 2、改agent配置文件 3、启动服务 图形操作&#xff1a; 【agent端配置】&#xff08;监控第二台l…

批处理判断目录是否存并且删除非空目录

这个功能很常用&#xff0c;但是偶尔总是忘记写法&#xff0c;这里贴一个亲测通过的例子吧。 ECHO OFF CLS if exist DirName ( rmdir /q /s DirName ) ELSE ( echo dir NOT exist!)这个例子的功能非常简单&#xff0c;判断目录DirName是否存在&#xff0c;存在就删除&#x…

【Linux】多线程(上)

本文详细介绍了多线程的常见概念 生产者消费者模型将在多线程&#xff08;下&#xff09;继续讲解 欢迎大家指正 提起讨论进步啊 目录 多线程的理解 线程的优点 线程的缺点&#xff1a; 线程的用途 线程VS进程 用户级线程库 POSIX线程库 线程创建&#xff1a; 线程…

【管理设计篇】聊聊系统部署生产有哪些方式

背景 对于互联网应用来说&#xff0c;除了在服务端开发和服务治理之外&#xff0c;还需要保证的有高可用运维。所以很多时候我们不能仅仅局限于&#xff0c;实现需求这个层面&#xff0c;比如软件设计&#xff0c;工程质量&#xff0c;性能&#xff0c;运维、可测试、可观测性…

基于深度学习的高精度交通标志检测系统(PyTorch+Pyside6+YOLOv5模型)

摘要&#xff1a;基于CCTSDB数据集的高精度交通标志&#xff08;指示、禁止和警告&#xff09;检测系统可用于日常生活中来检测与定位交通标志目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的交通标志目标检测识别&#xff0c;另外支持结果可视化与图片或视…

【react + antd】antd如何自定义请求使用antd的upload组件实现图片上传且可预览可删除

文章目录 1. 效果展示2. customRequest如何使用&#xff1f;特别注意&#xff1a; 3. 控制上传时什么时候使用customRequest&#xff0c;什么时候选择beforeUpload方法&#xff1f; 1. 效果展示 官网给出的案例无法使用封装好的请求方式上传图片&#xff0c;以及无法满足上传图…

使用模板创建【vite+vue3+ts】项目出现 “找不到模块‘vue‘或其相应的类型声明” 的解决方案

问题描述 项目前台需要使用Vue3Ts来写一个H5应用&#xff0c;然后我用模板创建 npm create vitelatest vue3-vant-mobile -- --template vue-ts创建完后进入HelloWorld.vue&#xff0c;两眼一黑 解决办法一 npm i --save-dev types/node然后在tsconfig.json的"compi…

【ARM Cortex-M 系列 1 -- Cortex-M0, M3, M4, M7, M33 差异】

文章目录 Cortex-M 系列介绍Cortex-M0/M0 介绍Cortex-M3/M4 介绍Cortex-M7 介绍Cotex-M33 介绍 下篇文章&#xff1a;ARM Cortex-M 系列 2 – CPU 之 Cortex-M7 介绍 Cortex-M 系列介绍 Cortex-M0/M0 介绍 Cortex-M0 是 ARM 公司推出的一款微控制器&#xff08;MCU&#xff0…

Golang跨平台UI框架之Wails(二)

上一篇文章我们讲解了如何简单创建一个 wails 的项目,但是现在有很多前端框架我们可以选择,比如: AngularVueSvelteReactLitVanilla各个都是时代的弄潮儿,就看哪一个适合你了,后续的系列都是以Angular为例。 1. 创建Angular模板项目 由于 wails 是没有官方支持Angular的…

代码随想录算法训练营之JAVA|第六天| 454. 四数相加 II

今天是第6天刷leetcode&#xff0c;立个flag&#xff0c;打卡60天。 算法挑战链接 454. 四数相加 IIhttps://leetcode.cn/problems/4sum-ii/ 第一想法 理解题目&#xff1a;找到四个数相加等于0 ——> 找到两个互为相反的数 理解完题目之后&#xff0c;那么我们要做的就…

IP首部报文字段

一、IP首部报文字段 字段如下图所示 二、每个字段的含义 版本 表示 IP 协议的版本。通信双方使用的 IP 协议版本必须一致。目前广泛使用的IP协议版本号为 4&#xff0c;即 IPv4 首部长度 这个字段所表示数的单位是 32 位字长&#xff08;1 个 32 位字长是 4 字节&#xff0…

设计模式-组合模式在Java中的使用示例-杀毒软件针对文件和文件夹进行杀毒

场景 组合模式 组合模式(Composite Pattern)&#xff1a; 组合多个对象形成树形结构以表示具有“整体—部分”关系的层次结构。 组合模式对单个对象&#xff08;即叶子对象&#xff09;和组合对象&#xff08;即容器对象&#xff09;的使用具有一致性&#xff0c; 组合模式…

不会接口测试?用Postman轻松入门 —— Postman实现get和post请求

测试行业现在越来越卷&#xff0c;不会点接口测试好像简历都已经拿不出手了&#xff0c;但很多小伙伴都会头疼&#xff1a;接口测试应该怎么入门&#xff1f;那么多的接口测试工具应该学哪个&#xff1f; 其实&#xff0c;接口测试工具&#xff0c;就像吃饭用的筷子&#xff0…

25.JavaWeb-接口文档Swagger

1.Swagger swagger是一款可以根据resutful风格生成的生成的接口开发文档&#xff0c;并且支持做测试的一款中间软件。 1.1 接口文档 接口文档是用于描述API的一份文档&#xff0c;它包含了API的详细信息&#xff0c;包括API的请求和响应参数、接口路径、请求方法、数据类型、返…

企企通入选《2023数字化采购发展报告》,持续赋能企业数字化采购

近日&#xff0c;国内知名产业数字化服务平台亿邦智库联合中国物流与采购联合会公共采购分会共同发布了《2023数字化采购发展报告》。 企企通一直以来积极推动企业采购供应链数字化升级和变革&#xff0c;不断通过技术、产品、服务的创新&#xff0c;引领国内采购供应链数字化的…

保持领先竞争对手,从普通变为非凡;为您的Android应用赋能数据结构和算法

数据结构和算法为Android开发提供了基础数据存储和处理的工具。开发者可以根据具体需求选择合适的数据结构和算法&#xff0c;以提高应用的性能、效率和用户体验。Android框架也提供了许多内置的数据结构和算法实现&#xff0c;如Bundle、ArrayAdapter等&#xff0c;以便开发者…

开发工具篇第二十六讲:使用IDEA进行本地调试和远程调试

开发工具篇第二十六讲&#xff1a;使用IDEA进行本地调试和远程调试 Debug用来追踪代码的运行流程&#xff0c;通常在程序运行过程中出现异常&#xff0c;启用Debug模式可以分析定位异常发生的位置&#xff0c;以及在运行过程中参数的变化&#xff1b;并且在实际的排错过程中&am…

【Visual Studio Code】---自定义键盘快捷键设置

概述 一个好的文章能够帮助开发者完成更便捷、更快速的开发。书山有路勤为径&#xff0c;学海无涯苦作舟。我是秋知叶i、期望每一个阅读了我的文章的开发者都能够有所成长。 一、进入键盘快捷键设置 1、进入键盘快捷键设置方法1 使用快捷键进入键盘快捷键设置先按 Ctrl K再…

k8s如何访问 pod 元数据

如何访问 pod 元数据 **我们在 pod 中运行容器的时候&#xff0c;是否也会有想要获取当前 pod 的环境信息呢&#xff1f;**咱们写的 yaml 清单写的很简单&#xff0c;实际上部署之后&#xff0c; k8s 会给我们补充在 yaml 清单中没有写的字段&#xff0c;那么我们的 pod 环境信…