【类的继承与派生的知识点】

news/2024/5/20 23:54:03/文章来源:https://blog.csdn.net/weixin_64993156/article/details/129694227

文章目录

  • 类的继承与派生的知识点
    • 类的继承与派生:
    • 类成员的访问:
    • 类型兼容规则:一个公有派生类的对象在使用上可以被当成基类的对象,反之不行
    • 单继承与多继承
    • 派生类的构造与析构
    • 类成员的标识与访问
  • 类的继承与派生的实验结果
    • 类型兼容规则
    • 派生类的析构与构造
    • 类成员的标识与访问
    • 菱形继承

类的继承与派生的知识点

类的继承与派生:

  1. 继承与派生:保持已有类的特征构造新类的过程为继承,在已有类的基础上新增特性而产生新类的过程称为派生

  1. 继承目的:实现代码重用;派生目的:实现源程序的改造

  1. 声明:class 派生类:继承方式 基类

  1. 派生类:

吸收基类成员:派生类包含了基类中除了构造析构函数以外的所有成员,构造析构函数不会被继承

改造基类成员:虚函数重写(实际是虚函数表的覆盖)以及同名函数

添加新的成员:加入新的构造析构函数以及其他成员

类成员的访问:

public—>protected—>private注意基类中私有成员不能被访问

基类中的私有成员派生类无法访问
继承方式为public时权限不变,但是私有成员也会被继承?
继承方式为private何protected(体现类的继承特征)时,权限与继承方式一致

类型兼容规则:一个公有派生类的对象在使用上可以被当成基类的对象,反之不行

  1. 派生类的对象可以赋值给基类对象

  2. 派生类的对象可以初始化基类的引用

  3. 指向基类的指针可以指向派生类
    通过基类的对象名与指针只能使用从基类继承的成员

#include<iostream>
#include <string>
using namespace std;
class Base
{
public:void showBase(){cout << "base成员函数的调用" << endl;}
};
class Son :public Base
{
public:void showSon(){cout << "Son成员函数的调用" << endl;}
};
int main()
{Son s1;Base b1 = s1;//派生类对象赋值给基类对象Base& b2 = s1;//派生类对象初始化基类的引用Base* b3 = &s1;//派生类地址初始化基类指针/基类指针指向派生类b1.showBase();//通过基类的对象名和指针只能调用基类成员b2.showBase();b3->showBase();return 0;
}

单继承与多继承

  1. 单继承:一个基类一个派生类

  2. 多继承:多基类一派生 class 派生类:继承方式1 基类1, 继承方式2 基类2

  3. 多重派生:一个基类多个派生类

  4. 多层派生:派生类为基类继续派生

派生类的构造与析构

  1. 基类的构造析构函数不会被继承,派生类需要写自己的构造析构函数

  2. 派生类的构造函数需要给基类构造函数传递参数,注意基类成员用基类名在初始化列表进行初始化!!!

#include<iostream>
#include <string>
using namespace std;
class Base
{
public:int m_A;Base(int a) :m_A(a) {}//如果有默认构造,派生类构造时可以不传参void showBase(){cout << "m_A=" << m_A << endl;}
};
class Son :public Base
{
public:int m_B;Son(int a, int b) :Base(a), m_B(b) {}//注意基类用基类名在初始化列表进行初始化,多个基类类推void showSon(){cout << "m_B=" << m_B << endl;}
};
int main()
{Son s(10, 20);s.showBase();s.showSon();return 0;
}

类成员的标识与访问

  1. 当派生类与基类成员同名时,优先调用派生类成员,基类同名成员被屏蔽(包括重载)

  2. 通过作用域来访问


#include<iostream>
#include <string>
using namespace std;
class Base
{
public:int m_A;Base(int a) :m_A(a) {}void show(){cout << "基类m_A=" << m_A << endl;}void show(int a){cout << "基类重载" << endl;}
};
class Son :public Base
{
public:int m_A;Son(int a1, int a2) :Base(a1), m_A(a2) {}void show(){cout << "派生类m_B=" << m_A << endl;}
};
int main()
{Son s(10, 20);s.show();//默认派生类,屏蔽了基类同名成员,包括重载s.Base::show();//作用域访问基类s.Base::show(10);//作用域访问基类重载类型return 0;
}
  1. 菱形继承引发的二义性问题:B1,B2继承A,C继承B1和B2,解决方法:同名屏蔽或虚函数
    A类称为虚基类,在继承前加virtual,vbptr虚基类指针virtual base pointer指向虚基数表
#include <iostream>
using namespace std;
class BaseA
{
public:int m_A;BaseA(int a) :m_A(a) {}
};
class BaseB1 :virtual public BaseA//虚继承
{
public:int m_B1;BaseB1(int a, int b1) :BaseA(a), m_B1(b1) {}
};
class BaseB2 :virtual public BaseA//虚继承
{
public:int m_B2;BaseB2(int a, int b2) :BaseA(a), m_B2(b2) {}
};
class SonC :public BaseB1, public BaseB2
{
public:int m_C;SonC(int a, int b1, int b2, int c) :BaseA(a), BaseB1(a, b1), BaseB2(a, b2), m_C(c) {}
};
int main()
{SonC c(30, 20, 20, 30);//B1,B2也可以初始化虚基类,但是C直接初始化优先级更高,调用了一次cout << c.m_A << endl;return 0;
}

建立对象所指定的类称为最(远)派生类
虚基类的成员由最派生类调用虚基类的构造函数进行初始化,在初始化列表调用构造函数初始化。
虚函数与纯虚函数在多态进行总结

类的继承与派生的实验结果

类型兼容规则

在这里插入图片描述

派生类的析构与构造

在这里插入图片描述

类成员的标识与访问

在这里插入图片描述

菱形继承

在这里插入图片描述


总结:通过这次试验,理解赋值兼容性原则,掌握派生类的复制构造函数的定义方法;在派生类中可以通过基类名调用基类的成员。又通过做实验加深对多重继承方式以及两个类派生出新类。在类体中声明成员函数,在类外定义成员函数等。掌握类的继承与派生的实现方法;定义合适的派生类构造函数,用于初始化基类成员和对象成员。继承是在一个已有的类上建立一个新的类,已存在的类称为基类,新建立类称为派生类。继承的方式有public,private和protected三种,默认为private.继承的方式限定了基类成员在派生类中的访问权限:类的public成员可以通过对象来访问,private成员不能通过对象和派生类访问,而protected也不能通过对象访问,但是基类protected成员可以在派生类中访问。

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

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

相关文章

Baumer工业相机堡盟相机如何使用Sharpening图像锐化功能( Sharpening图像锐化功能的优点和行业应用)(C++)

项目场景 Baumer工业相机堡盟相机是一种高性能、高质量的工业相机&#xff0c;可用于各种应用场景&#xff0c;如物体检测、计数和识别、运动分析和图像处理。 Baumer的万兆网相机拥有出色的图像处理性能&#xff0c;可以实时传输高分辨率图像。此外&#xff0c;该相机还具…

【计算机网络】如何解决TCP粘包问题?

【计算机网络】如何解决TCP粘包问题&#xff1f; 文章目录【计算机网络】如何解决TCP粘包问题&#xff1f;如何理解字节流&#xff1f;如何解决粘包&#xff1f;固定长度的消息特殊字符作为边界自定义消息结构如何理解字节流&#xff1f; 之所以会说 TCP 是面向字节流的协议&a…

RK3588编译环境Ubuntu20.04编译配置-增加交换内存

迅为提供的编译环境 Ubuntu20.04 默认配置了交换内存是 9G&#xff0c;如果在编译过程中&#xff0c;因内 存不够而编译报错&#xff0c;可以参考本小节进行设置。 这里举例分配 5G 交换内存。 在开始之前&#xff0c;使用命令检查一下您的 ubuntu 的 swap 分区。 sudo swa…

Android进阶面经,面试10余家经验分享,拿到offer真不难~

前言 我们都知道面试大厂主要就是考察程序员技术方向的专业技能&#xff0c;Java开发主要考察的就是Java方面的专业技能&#xff0c;而Android岗位的 专业技能 就是Android程序员面试的重要考察方向。 大厂的招聘条件是明牌的&#xff0c;但技术这一块却难倒了大部分的人。 面…

蓝桥杯刷题冲刺 | 倒计时18天

作者&#xff1a;指针不指南吗 专栏&#xff1a;蓝桥杯倒计时冲刺 &#x1f43e;马上就要蓝桥杯了&#xff0c;最后的这几天尤为重要&#xff0c;不可懈怠哦&#x1f43e; 文章目录0.知识点1.乳草的入侵今天写 搜索题 0.知识点 DFS 设计步骤 确定该题目的状态&#xff08;包括边…

服务器boa移植

服务器boa移植 文章目录服务器boa移植1.下载boa2.解压3.安装词法解析器4.修改源码5. 编译、创建配置文件6.修改配置文件boa.conf7.运行测试1.下载boa Boa Webserver http://www.boa.org/ 2.解压 tar -xf boa-0.94.13.tar.gz3.安装词法解析器 sudo apt-get install bisonsud…

我们为什么不能忽视业务只讲数据治理?_光点科技

数据治理是一项重要的业务实践&#xff0c;可以帮助组织更好地管理和利用数据。然而&#xff0c;一些企业错误地将数据治理视为一项独立的技术实践&#xff0c;而忽略了业务需求。那么&#xff0c;为什么不能忽视业务&#xff0c;只讲数据治理呢&#xff1f;首先&#xff0c;数…

网络基础知识和常用命令

IP、子网掩码、网关、DNS、端口号网络的基本概念客户端:应用 C/S&#xff08;客户端/服务器&#xff09; B/S&#xff08;浏览器/服务器&#xff09;服务器&#xff1a;为客户端提供服务、数据、资源的机器请求&#xff1a;客户端向服务器索取数据响应&#xff1a;服务器对客户…

H2数据库

H2是一个用Java开发的嵌入式数据库&#xff0c;它本身只是一个类库&#xff0c;可以直接嵌入到应用项目中。 H2简介 H2是一个Java编写的关系型数据库&#xff0c;它可以被嵌入Java应用程序中使用&#xff0c;或者作为一个单独的数据库服务器运行。 H2数据库的前身是 Hypersoni…

线段树SegmentTree

&#x1f34f;&#x1f350;&#x1f34a;&#x1f351;&#x1f352;&#x1f353;&#x1fad0;&#x1f951;&#x1f34b;&#x1f349;&#x1f95d; 什么是线段树&#xff0c;它能解决什么样的问题&#xff1f; 文章目录&#x1f36d;问题引入&#x1f95d;线段…

代码随想录|day21|二叉树part07 ● 530.二叉搜索树的最小绝对差 ● 501.二叉搜索树中的众数 ● 236. 二叉树的最近公共祖先

530.二叉搜索树的最小绝对差 链接&#xff1a;代码随想录 需要领悟一下二叉树遍历上双指针操作&#xff0c;优先掌握递归 第一次做&#xff0c;理解错误&#xff0c;认为只需要以节点为单位&#xff0c;认为由于是二叉搜索树&#xff0c;所以中序遍历一定是一个连续的有序序列…

vue3+vite+ts 搭建脚手架01创建vite项目并且在项目中初次使用router

vue3vite 搭建脚手架01创建vite项目并且在项目中使用router 1.使用yarn安装vite项目 yarn create vite 搭建vite项目 在开发语言中选择vuets2.安装现在最新的 vue-router4 yarn add vue-router4 在packger中检查是否成功安装3.简单配置router文件 在项目中新建views和…

(19)C#传智:CSS,选择器,样式(第19天)

vs2022保存html项目时&#xff0c;偶尔会有死机&#xff0c;只得强行关闭重新打开。 一、CSS简介 CSS(Cascading Style Sheet)层叠样式表。能让网页制作者有效的定制&#xff0c;改善网页的效果。 CSS是对Html的补充&#xff0c;它很好地控制了网页的显示效果。并实现网页…

A.[OCR]基于PaddleOCR的多视角集装箱箱号检测识别,实现检测识别模型串联推理。

基于PaddleOCR的多视角集装箱箱号检测识别 一、项目介绍 集装箱号是指装运出口货物集装箱的箱号&#xff0c;填写托运单时必填此项。标准箱号构成基本概念&#xff1a;采用ISO6346&#xff08;1995&#xff09;标准 标准集装箱箱号由11位编码组成&#xff0c;如&#xff1a;…

UniApp + SpringBoot 实现接入支付宝支付功能和退款功能

一、支付宝开放平台设置 注册支付宝支付功能需要个体工商户或企业才可以&#xff01;需要有营业执照才能去申请哦&#xff01; 1、登录到控制台 进入支付宝开放平台 控制台 2、开发设置 3、产品绑定APP支付 如果没有绑定APP支付就会报商家订单参数异常&#xff0c;请重新发起…

Kubernetes学习(八)Helm应用包管理器

为什么需要Helm K8S上的应用对象&#xff0c;都是由特定的资源描述组成&#xff0c;包括deployment、service等。都保存各自文件中或者集中写到一个配置文件&#xff0c;然后kubectl apply –f 部署。 如果应用只由一个或几个这样的服务组成&#xff0c;上面部署方式足够了。…

华为OD机试题,用 Java 解【合并数组】问题 | 含解题说明

华为Od必看系列 华为OD机试 全流程解析+经验分享,题型分享,防作弊指南华为od机试,独家整理 已参加机试人员的实战技巧华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典本篇题目:合并数组 题目 现在有多组整数…

Ubuntu+Nvidia驱动+cuda+cudnn环境配置

目录 Ubuntu系统安装 rtw89版本是需要一定高的内核版本的 Ubuntu Nvidia驱动安装 在附加驱动中安装完nvidia专用驱动&#xff0c;nvidia-smi没有显示驱动信息 安装cuda 安装cudnn Ubuntu系统安装 首先便是双系统的安装&#xff0c;我本身电脑是Windows&#xff0c;装Ubu…

JS: mac台式电脑使用汇总

双指鼠标左滑–回到桌面optaion键 相当于辅助键 optaiona复制 optionx剪切 …操作文件&#xff1a; 苹果文件夹是沙箱模式&#xff0c;要从一个文件夹拖动到另一个文件夹 —调试 iphone连接mac电脑(苹果safari浏览器-开发–xxx的电脑-hap)即可真机调试 –环境 MAC安装node环境:…

《RabbitMQ高阶知识》—消息可靠性

《RabbitMQ高阶知识》— 消息可靠性 文章目录《RabbitMQ高阶知识》— 消息可靠性&#xff08;1&#xff09;异常捕获机制&#xff08;2&#xff09;AMQP/RabbitMQ的事务机制&#xff08;3&#xff09; 发送端确认机制&#xff08;4&#xff09; 持久化存储机制&#xff08;5&am…