c++(五)

c++(五)

  • 继承
    • 基类和派生类
    • 继承的格式
    • 继承的方式
      • 三种:public、private、protected
    • 继承的规则
      • 多层继承
      • 多重继承
  • 类与类的关系

继承

  • 一个新类从已有的类那里获得其已有特性(属性、行为),这种现象称为类的继承

基类和派生类

<1>从已有的类(父类/基类)产生一个新的子类,称为类的派生。
<2>派生类是基类的具体化,而基类则是派生类的抽象。

  • 当新的类是已经存在的类的一种特殊版本的时候,可以使用继承
  • 子类要继承父类的所有特性(属性和行为),但是构造函数、析构函数是不能被继承的,友元也不能被继承,因为它不是类的成员

继承的格式

class 类名: 访问限定符 基类名
{
;
}

继承的方式

三种:public、private、protected

三种:public、private、protected

<1>以public的方式继承
在这里插入图片描述
<2>以private方式继承
在这里插入图片描述
<3>以protected方式继承
在这里插入图片描述

总结:
<1>不管使用哪种方式继承,父类的private成员在子类内部外部都不可访问
<2>不管使用哪种方式继承,父类的protected成员在子类内部可以访问,子类外部不可访问
<3>只有采用public方式继承的时候,父类中是什么样子的访问限定符在子类中也是什么样的访问限定符
<4>在继承时,父类中的成员变量一般建议放在protected中
<5>继承的方式建议用public的方式去继承

子类构造函数的执行
在继承关系中,创建子类对象时,先执行父类的构造函数,再执行子类的构造函数
子类析构函数的执行
在继承关系中,当子类的生命周期结束的时候,先执行子类的析构函数,再执行父类的析构函数

继承的规则

<1>子类的构造函数只会对子类的对象进行空间的分配和初始化,父类中继承来的属性只能由父类的构造函数
进行初始化
<2>在子类创建对象的时候,若没有指定父类要执行的构造函数,父类就会执行它的默认构造函数

在这里插入图片描述

多层继承

A–>B–>C

如果不指定父类的构造函数,默认执行的是父类的默认构造函数

#include <iostream>
using namespace std;
/*
* 多重继承
*/
class People
{
public:People(){cout << "父类默认构造" << endl;}People(string name , int age = 18):name(name),age(age){cout << "父类构造" << endl;}~People(){cout << "父类析构" << endl;}void show(){cout << "姓名:" << this->name << ","<< "年龄:" << this->age << endl;}
private:
protected:string name;int age;
};
class Stu : public People
{
public:Stu(int sno = 1, string name = "李四", int age = 18) :sno(sno){cout << "子类构造函数" << endl;}~Stu(){cout << "子类析构" << endl;}//重定义void show(){cout << "学号:" << this->sno << ",姓名:" << this->name << ",年龄:" << this->age << endl;}
private:
protected:int sno;
};int main()
{Stu stu1;stu1.show();return 0;
}

在这里插入图片描述
指定执行父类的构造函数

#include <iostream>
using namespace std;
/*
* 多重继承
*/
class People
{
public:People(){cout << "父类默认构造" << endl;}People(string name , int age = 18):name(name),age(age){cout << "父类构造" << endl;}~People(){cout << "父类析构" << endl;}void show(){cout << "姓名:" << this->name << ","<< "年龄:" << this->age << endl;}
private:
protected:string name;int age;
};
class Stu : public People
{
public:Stu(int sno = 1, string name = "李四", int age = 18) :People(name, age),sno(sno){cout << "子类构造函数" << endl;}~Stu(){cout << "子类析构" << endl;}//重定义void show(){cout << "学号:" << this->sno << ",姓名:" << this->name << ",年龄:" << this->age << endl;}
private:
protected:int sno;
};int main()
{Stu stu1;stu1.show();Stu stu2(2, "王五", 22);stu2.People::show();stu2.show();return 0;
}

在这里插入图片描述

多重继承

在这里插入图片描述
**注意:**在多重继承关系中,先执行谁的构造函数与初始化的顺序无关,是由继承的先后顺序决定的
在这里插入图片描述
出现的问题:
在这里插入图片描述
解决:
<1>加上作用域(不合适)
在这里插入图片描述
<2>虚继承
在这里插入图片描述

#include <iostream>
using namespace std;
/*
* 多重继承
*/
class People
{
public:People(){cout << "people 默认构造" << endl;}People(string name, int age = 20) :name(name), age(age){cout << "people类构造" << endl;}~People(){cout << "people 析构" << endl;}void show(){cout << "姓名:" << this->name << ",年龄:" << this->age << endl;}
private:
protected:string name;int age;
};
class Worker :virtual public People
{
public:Worker(string name, int age, int salary = 30000) :People(name, age), salary(salary){cout << "worker构造" << endl;}~Worker(){cout << "worker析构" << endl;}void show(){cout << "姓名:" << this->name << ",年龄:" << this->age << ",薪资:" << this->salary << endl;}
private:
protected:int salary;
};
class Farmer : virtual public People
{
public:Farmer(string name, int age, int filecout = 200) :People(name, age), filecout(filecout){cout << "farmer构造" << endl;}~Farmer(){cout << "farmer析构" << endl;}void show(){cout << "姓名:" << this->name << ",年龄:" << this->age << ",几亩田:" << this->filecout << endl;}
private:
protected:int filecout;
};
class workFarmer : public Worker, public Farmer
{
public:workFarmer(string name = "溜溜", int age = 22, int salary = 29830, int filecout = 200,int car = 3) :Worker(name, age, salary), Farmer(name, age, filecout),People(name,age),car(car){cout << "workFarmer构造" << endl;}~workFarmer(){cout << "workFarmer析构" << endl;}void show(){cout << "姓名:" << this->name << ",年龄:" << this->age << ",几亩田:" << this->filecout <<",薪资:" << this->salary << ",车辆:" << this->car << endl;}
private:
protected:int car;
};int main()
{workFarmer wf1;wf1.show();wf1.Farmer::show();wf1.Worker::show();return 0;
}

在这里插入图片描述

类与类的关系

继承关系 is a的关系
编辑框类、按钮类、标签类 都称为组件类
编辑框、按钮、标签都是组件中的一种。
包含关系 has a的关系
登录类、注册类、
登录类中包含了编辑框类、按钮类、标签类的对象 ,这些标签、编辑框、按钮都是构成这些界面的组件!

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

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

相关文章

WPS PPT学习笔记 2 结构页的制作

制作PPT结构页 制作封面页、目录页、封底页。它们都属于结构页。而时间轴页&#xff0c;流程图页&#xff0c;框架图页这些属于内容页。 做一份PPT 讲一个故事 封面页 开头&#xff0c; 目录页 脉络&#xff0c; 各式内容页 详情&#xff0c; 封底页 结尾。 所有的结构页…

关于Windows中桌面窗口管理器的知识,看这篇文章就可以了

序言 你打开了任务管理器,发现了一个叫做“桌面窗口管理器”的东西,它是恶意软件吗?它应该在任务管理器吗?如果它应该在那里,它的作用什么?以下是你需要了解的所有信息。 什么是桌面窗口管理器 Desktop Window Manager(dwm.exe)是一个合成窗口管理器,可以在Windows…

打印机里失败的任务删不掉的解决办法 斑马打印机更新电脑驱动和升级打印机固件 提示ribbon out 并黄状态亮+黄供应闪

强删打印任务 WinR services.msc 停止服务 Print spooler C:\Windows\System32\spool\PRINTERS 清空文件夹下所有文件 详细 要删除打印机里失败的任务&#xff0c;可以按照以下步骤操作&#xff1a; 停止打印服务&#xff1a;您需要停止Windows系统中的“Print Spooler”服…

VScode代码片段自动转图标

注&#xff1a;在VScode编辑器中&#xff0c;编辑html、vue等文件时&#xff0c;特定代码片段&#xff08;token/xxx’等&#xff09;自动转图标显示&#xff0c;按住“ctrl鼠标左键”还可跳转“https://icones.js.org/collections”&#xff0c;个人感觉干扰代码编写&#xff…

Android Compose 七:常用组件 Image

1 基本使用 Image(painter painterResource(id R.drawable.ic_wang_lufei), contentDescription "" ) // 图片Spacer(modifier Modifier.height(20.dp))Image(imageVector ImageVector.vectorResource(id R.drawable.ic_android_black_24dp), contentDescript…

Round-Robin 调度逻辑算法

Round-Robin 调度逻辑算法 1 Intro1.1 固定优先级1.2 Round-Robin算法 之前上学还是工作&#xff0c;都接触过调度算法&#xff1a;Round-Robin和weight-Round Robin算法&#xff0c;但只知道它的功能和目的是什么&#xff0c;没有具体了解如何实现的&#xff1b; 现在是工作上…

maven聚合工程整合springboot+mybatisplus遇到的问题

前言&#xff08;可以直接跳过看下面解决方法&#xff09; 项目结构 两个module&#xff1a; yema-terminal-boot 是springboot项目&#xff0c;子包有&#xff1a;controller、service、dao 等等。属于经典三层架构。那么&#xff0c;该module可以理解为是一个单体项目&…

kafka-消费者组偏移量重置

文章目录 1、消费者组偏移量重置1.1、列出所有的消费者组1.2、查看 my_group1 组的详细信息1.3、获取 kafka-consumer-groups.sh 的帮助信息1.4、 偏移量重置1.5、再次查看 my_group1 组的详细信息 1、消费者组偏移量重置 1.1、列出所有的消费者组 [rootlocalhost ~]# kafka-…

监管端..

文章目录 1. 登录流程2. 日志AOP 1. 登录流程 使用账号&#xff08;手机号&#xff09;、密码、验证码。登录就是获取token的&#xff0c;输入的账号密码用RSA加密&#xff08;非对称&#xff09; 首先输入账号密码&#xff0c;在发送手机验证码时候先校验账号密码有没有输入…

私域如何高效管理多微信并实现聚合聊天?

在私域经营中&#xff0c;管理多个微信号是一项具有挑战性的任务。为了提高工作效率&#xff0c;辅助工具成为必不可少的一部分。而个微管理系统将为大家带来高效的多微信号管理体验&#xff0c;让大家能够更好地聚合聊天。 首先&#xff0c;个微管理系统提供了一个统一的界面…

【UML】-01-UML基本元素的介绍

1、UML的词汇表 &#xff08;1&#xff09;事物&#xff1b; &#xff08;2&#xff09;关系&#xff1b; &#xff08;3&#xff09;图。 事物是对模型中首要成分的抽象&#xff1b;关系把事物结合在一起&#xff1b;图聚集了相关的事物。 注&#xff1a;事物也称为元素 2…

vivo X100 Ultra自称销售额破5亿,真实销量成谜?

文/张诗雨 5月28日9点&#xff0c;vivo 正式启动了其旗舰新机vivo X100 Ultra的全渠道销售工作。这款新机&#xff0c;早在5月13日就已正式亮相&#xff0c;并推出了三种存储容量的版本&#xff0c;分别是12GB256GB、16GB512GB以及16GB1TB&#xff0c;而相应的售价也不低&…

常见排序算法之选择排序

目录 一、选择排序 1.1 什么是选择排序&#xff1f; 1.2 思路 1.2.1 思路一 1.2.2 优化思路 1.3 C语言源码 1.3.1 思路一 1.3.2 优化思路 二、堆排序 2.1 调整算法 2.1.2 向上调整算法 2.1.3 向下调整算法 2.2 建堆排序 一、选择排序 1.1 什么是选择排序&#xf…

人工智能与区块链技术:开启未来科技的双引擎

在当今科技飞速发展的时代&#xff0c;人工智能和区块链技术如同两颗璀璨的明星&#xff0c;照亮了人类通往未来的道路。 人工智能&#xff0c;以其强大的学习和分析能力&#xff0c;正悄然改变着我们的生活。它能够处理海量的数据&#xff0c;为我们提供精准的预测和个性化的…

设计模式:外观模式 导诊台。空指针异常

文章目录 UML类图目录结构思路Register.javaOutpatientService.javaPrice.javaPharmacy.javaFacade.java空指针异常 Test.java UML类图 目录结构 思路 照着写&#xff0c;然后getRegister&#xff08;&#xff09;方法的具体实现就是&#xff1a;打印一句话&#xff0c;然后到…

从 0 手撸一个 pytorch

背景介绍 最近抽空看了下 Andrej Karpathy 的视频教程 building micrograd&#xff0c;教程的质量很高。教程不需要任何前置机器学习基础&#xff0c;只需要有高中水平的数学基础即可。整个教程从 0 到 1 手撸了一个类 pytorch 的机器学习库 micrograd&#xff0c;核心代码不到…

Vue状态管理深度剖析:Vuex vs Pinia —— 从原理到实践的全面对比

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 &#x1f44b; 引言&#x1f4cc; Vuex 基础知识核心构成要素示例代码 &#x1f4cc; Pinia 基础知识核心构成要素示例代码 &#x1f4cc; Vuex与Pinia的区别&#x1f4cc; 使用示例与对比&#x1f4cc; 总结 &#x1f44b;…

探索Solana链上DApp开发:高性能区块链生态的新机遇

Solana 是一个新兴的区块链平台&#xff0c;致力于为 DApp&#xff08;去中心化应用程序&#xff09;开发者提供高性能、低成本的解决方案。Solana 的独特之处在于其创新性的共识机制和高吞吐量的网络&#xff0c;使得开发者可以构建高度可扩展的 DApp&#xff0c;并为用户提供…

云服务器如何使用局域网服务器的磁盘空间

说明 云服务器中的磁盘空间不足时&#xff0c;想要开通更多的磁盘空间&#xff0c;但奈何价格太贵&#xff0c;开不起 刚好局域网中有闲置的服务器空间可以拿来用&#xff0c;这里我们直接使用Samba服务来共享文件夹&#xff0c;使用frp来进行内网穿透&#xff1b; 1、磁盘挂…

OSPF优化——OSPF减少LSA更新量2

二、特殊区域——优化非骨干区域的LSA数量 不是骨干区域、不能存在虚链路 1、不能存在 ASBR 1&#xff09;末梢区域 该区域将拒绝 4、5LSA的进人&#xff0c;同时由该区域连接骨干0区域的ABR 向该区域&#xff0c;发布一条3类的缺省路由; 该区域内每台路由器均需配置&#xf…