当前位置: 首页 > news >正文

【C++】8___继承

目录

 一、基本语法

 二、继承方式

三、对象模型

四、继承中的构造与析构的顺序

五、继承中同名成员处理

 六、多继承语法

 七、菱形继承


 一、基本语法

好处:减少重复的代码

语法: class   子类  :  继承方式   父类

子类  也称为  派生类

父类  也称为  基类

派生类中的成员,包含两大部分:

一类是从基类继承过来的,一类是自己增加的成员

从基类继承过来的表现其共性,而新增的成员体现了其个性

 二、继承方式

  • class 子类 :public 父类

        父类中的public、protected继承在子类中依然不变,私有权限无法继承。

  • class 子类 :protected 父类

         父类中的public、protected继承在子类时变为protected,私有权限无法继承。

  • class 子类 :private 父类

        父类中的public、protected继承在子类时变为private,私有权限无法继承。

 代码示例

#include<iostream>
using namespace std;class base1{public:int m_A;
protected:int m_B;
private:int m_C;
};// public 继承
class Son1 : public base1{  void fun(){m_A = 10;m_B = 10;
//		m_C = 10; //私有权限无法继承}
};
void test1(){Son1 son1;son1.m_A = 2;
//	son1.m_B = 3;
//	son1.m_C = 4;
}// protected 继承
class Son2 : protected base1{void fun(){m_A = 10; //变为protectedm_B = 10;//变为protected//m_C = 10; //私有权限无法继承}
};
void test2(){Son2 son2;//	son2.m_A = 2; //变为protected,类外无法访问//	son2.m_B = 3; //变为protected,类外无法访问//	son2.m_C = 4;
}// private 继承
class Son3 : private base1{void fun(){m_A = 10; //变为privatem_B = 10; //变为private//m_C = 10; //私有权限无法继承}
};
void test3(){Son3 son3;
//		son3.m_A = 2; //变为private,类外无法访问//	son2.m_B = 3; //变为private,类外无法访问//	son2.m_C = 4;
}
int main(){test1();test2();test3();return 0;
}

三、对象模型

父类当中的非静态成员变量都会继承下去,私有成员也会继承,只是不能访问

代码示例

#include<iostream>
using namespace std;class per{
public:int m_A;
protected:int m_B;
private:int m_C;
};class son : public per{
public:int m_D;
};void test(){cout<<"sizeof(son)="<<sizeof(son)<<endl;
}int main(){test();
}

四、继承中的构造与析构的顺序

先构造父类,再构造子类。析构顺序与构造顺序相反

代码示例

#include<iostream>
using namespace std;class Base{
public:Base(){cout<<"父类中的构造"<<endl;}~Base(){cout<<"父类中的析构"<<endl;}
};class Son : public Base{
public:Son(){cout<<"子类中的构造"<<endl;}~Son(){cout<<"子类中的析构"<<endl;}
};void test(){
//	Base b;Son s;
}
int main(){test();return 0;
}

五、继承中同名成员处理

  •  子类对象可以直接访问到子类中的同名函数
  • 子类对象加作用域可以访问到父类中的成员函数
  • 当子类与父类拥有同名的成员函数时,子类会隐藏父类中同名的成员函数,加作用域可以访问到父类中的同名函数

非静态成员变量与静态成员变量处理方式一致,只不过静态成员变量有两种访问方式:

  1. 通过对象进行访问   例:s.fun();
  2. 通过类名进行访问   例:Son::Base::fun();

 代码示例

#include<iostream>
using namespace std;class Base{
public:Base(){m_A = 100;}void fun(){cout<<"Base 的 fun()"<<endl;}void fun(int ){cout<<"Base 的 fun(int)"<<endl;}int m_A;
};class Son : public Base{
public:Son(){m_A = 200;}void fun(){cout<<"Son 的 fun()"<<endl;}int m_A;};void test(){Son s;cout<<"m_A="<<s.m_A<<endl; //200cout<<"m_A="<<s.Base::m_A<<endl; //100,同名时,调用父类中的成员需要加作用域s.fun();s.Base::fun();s.Base::fun(1);  // 子类与父类拥有同名的成员函数时,子类会隐藏父类中所有版本的同名函数
}
int main(){test();return 0;
}

 六、多继承语法

语法:class  子类 :继承方式 父类1 , 继承方式  父类2,...

 代码示例

#include<iostream>
using namespace std;class Base1{
public:Base1(){m_A = 100;}int m_A;
};class Base2{
public:Base2(){m_A = 200;}int m_A;
};class son : public Base1,public Base2{
public:son(){m_B = 200;}int m_B;
};void test (){son s;cout<<"sizeof(s)"<<sizeof(s)<<endl;cout<<s.Base1::m_A<<endl; // 继承中出现同名时需要+作用域cout<<s.Base2::m_A<<endl;
}
int main(){test();
}

 七、菱形继承

 关键字:virtual

如下示例:加上virtual关键字后,Sleep和Tuo 两个类里的m_Age 存的是 vbptr(虚基类指针),指向各自的 vbtable(虚基类列表)。从而直接拿到Animal 中的m_Age,解决SleepTuo 拿到两份相同数据的问题。

代码示例

#include<iostream>
using namespace std;class Animal{
public:int m_Age;
};// 当子类继承两份相同的数据时:
// 继承前加上 virtual 关键字后,变为虚继承
// 此时公共的父类 Animal 称为虚基类
class Sleep : virtual public Animal{};
class tuo : virtual public Animal{};class SleepTuo : public Sleep , public tuo{};void test1(){SleepTuo y;y.Sleep::m_Age = 100;y.tuo::m_Age = 200;cout<<y.Sleep::m_Age<<endl;cout<<y.tuo::m_Age<<endl;cout<<y.m_Age<<endl;
}int main(){test1();
}

相关文章:

【C++】8___继承

目录 一、基本语法 二、继承方式 三、对象模型 四、继承中的构造与析构的顺序 五、继承中同名成员处理 六、多继承语法 七、菱形继承 一、基本语法 好处&#xff1a;减少重复的代码 语法&#xff1a; class 子类 &#xff1a; 继承方式 父类 子类 也称为 派生类 父类…...

C# 中的异常处理:构建健壮和可靠的程序

C#中的异常处理&#xff08;Exception Handling&#xff09;。异常处理是编程中非常重要的一部分&#xff0c;它允许开发者优雅地处理程序运行时可能出现的错误或意外情况。通过有效的异常处理&#xff0c;可以使应用程序更加健壮、可靠&#xff0c;并提供更好的用户体验。以下…...

基于智能合约的医院凭证共享中心路径探析

一、引言 随着医疗行业的不断发展和信息技术的进步&#xff0c;基于智能合约的医疗凭证共享中心解决方案成为了可能。在当今数字化时代&#xff0c;医疗领域面临着诸多挑战&#xff0c;如医疗数据的分散存储、信息共享的不便捷以及凭证管理的复杂性等问题。而智能合约的出现&am…...

vba学习系列(9)--按需求计数单元格数量

系列文章目录 文章目录 系列文章目录前言一、按需求计数单元格数量1.需求 二、使用步骤1.vba源码2.整理后 总结 前言 一、按需求计数单元格数量 1.需求 一个表中有多个类型的单元格内容&#xff0c;比如&#xff1a;文字、数字、特殊字符、字母数字…… 我们要计数字母数字的…...

scale index的计算

scale index定义 基本实现 需要注意&#xff0c;scale index的提出者分别构建了MATLAB和R语言的实现方式。 但是&#xff0c;需要注意&#xff0c;经过我向作者求证。 MATLAB编写的代码已经“过时了”&#xff0c;为了拥抱时代&#xff0c;作者构建了R语言包&#xff0c;名称为…...

鸿蒙实现Web组件开发

目录&#xff1a; 1、简介&使用场景2、加载网络页面3、加载本地页面4、加载HTML格式的文本数据5、设置深色模式6、上传文件7、在新窗口中打开页面8、管理位置权限 1、简介&使用场景 Web是一种基于互联网的技术和资源的网络服务系统。它是指由许多互连的计算机组成的全…...

Linux——linux系统移植

创建VSCode工程 1、将NXP官方的linux内核拷贝到Ubuntu 2、解压缩tar -vxjf linux-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2 NXP官方开发板Linux内核编译 1、将.vscode文件夹复制到NXP官网linux工程中&#xff0c;屏蔽一些不需要的文件 2、编译NXP官方EVK开发板对应的Linux系统…...

工业摄像头应对复杂环境的策略与解决方案

工业摄像头需应对复杂环境&#xff0c;如极端温度、振动、尘土、光照不足等。为确保稳定工作&#xff0c;它采用了先进技术和设计。详细分析如下&#xff1a; 一、增强环境适应性 采用高灵敏度传感器&#xff1a;使用CMOS或CCD图像传感器&#xff0c;适应低光照条件。 高精度、…...

重生之我在异世界学编程之C语言:深入动态内存管理篇

大家好&#xff0c;这里是小编的博客频道 小编的博客&#xff1a;就爱学编程 很高兴在CSDN这个大家庭与大家相识&#xff0c;希望能在这里与大家共同进步&#xff0c;共同收获更好的自己&#xff01;&#xff01;&#xff01; 本文目录 引言正文一 动态内存管理的必要性二 动态…...

【经典论文阅读】Latent Diffusion Models(LDM)

Latent Diffusion Models High-Resolution Image Synthesis with Latent Diffusion Models 摘要 动机&#xff1a;在有限的计算资源下进行扩散模型训练&#xff0c;同时保持质量和灵活性 引入跨注意力层&#xff0c;以卷积方式实现对一般条件输入&#xff08;如文本或边界框…...

智能指针中的weak_ptr(弱引用智能指针)

弱引用智能指针 std::weak_ptr 可以看做是shared_ptr的助手,它不管理 shared_ptr 内部的指针。std::weak_ptr 没有重载操作符*和->&#xff0c;因为它不共享指针&#xff0c; 不能操作资源&#xff0c;所以它的构造不会增加引用计数&#xff0c;析构也不会减少引用计数,它的…...

【电子通识】机电继电器和固态继电器的区别

机电继电器 机电继电器于19世纪中叶发明。这些器件将线圈与可移动的金属触点结合使用来充当电动开关。这些器件会因为金属触点出现磨损而发生故障,例如焊死在一起。因此,在完全失效之前器件能够进行的开关周期数有限,从而限制了其总体可靠性。 一般情况下继电器控制…...

工业异常检测-CVPR2024-新的3D异常数据合成办法和自监督网络IMRNet

论文&#xff1a;https://arxiv.org/pdf/2311.14897v3.pdf 项目&#xff1a;https://github.com/chopper-233/anomaly-shapenet 这篇论文主要关注的是3D异常检测和定位&#xff0c;这是一个在工业质量检查中至关重要的任务。作者们提出了一种新的方法来合成3D异常数据&#x…...

如何创建对话窗口

文章目录 1. 概念介绍2. 使用方法3. 示例代码我们在上一章回中介绍了Dismissible Widget相关的内容,本章回中将介绍AlertDialog Widget.闲话休提,让我们一起Talk Flutter吧。 1. 概念介绍 我们介绍的AlertDialog是指程序中弹出的确认窗口,其实我们在上一章回中删除ListView中…...

新手上路,学Go还是Python

对于新手来说&#xff0c;Go和Python都是很好的编程语言&#xff0c;它们各有特点&#xff0c;以下是详细的对比来帮助你决定先学哪一个&#xff1a; 一、语法和学习难度 Python 语法简洁易懂&#xff1a;Python以其简洁、优雅的语法而闻名&#xff0c;代码的可读性很高。例如…...

<!DOCTYPE html>的作用是什么

一、背景 从今天开始会不定时的发布一些前端的常见面试题&#xff0c;供大家参考。今天要发布的内容是关于html的面试题的作用是什么。接下来就一起讨论以下吧 二、概念 DOCTYPE 是html5中一种标准通用标记语言的文档类型的声明&#xff0c;它的目的就是为了告诉浏览器应该以…...

EasyExcel改名为FastExce做了那些改变呢

回到&#xff1a;github原作者地址&#xff1a;https://github.com/CodePhiliaX/fastexcel 中文 |English | 什么是 FastExcel FastExcel 是由原 EasyExcel 作者创建的新项目。2023 年我已从阿里离职&#xff0c;近期阿里宣布停止更新 EasyExcel&#xff0c;作者他本人决定继…...

狗狗的生育周期:关注与呵护

狗狗的繁殖是一个复杂且需要谨慎对待的过程&#xff0c;了解其生产周期对于宠物主人以及从事相关行业的人员至关重要。 一般而言&#xff0c;狗狗的怀孕周期约为两个月左右&#xff0c;但这并非绝对固定。从受孕到分娩&#xff0c;通常在 58 至 65 天之间波动。小型犬可能相对…...

ABAP DIALOG屏幕编程2

在上一篇博客ABAP DIALOG屏幕编程1中阐述了DIALOG、PBO、PAI的概念并且对常用页面元素怎么用进行了演示。在这一篇博文中会讲述怎么添加下拉框、搜索帮助&#xff0c;怎么创建表控件、屏幕跳转等。会用到上一篇里面的内容。 有关程序包含文件结构如下。 一、响应用户指令 如上…...

获取缓存大小与清除 Web 缓存 - 鸿蒙 HarmonyOS Next

针对浏览器 Web 组件清除缓存相关,具体实现如下 code 实例所示: /*公共方法类*/ export class PublicUtils {/*获取缓存大小*/static async getCacheSize(): Promise<number> {try {let bundleStats await storageStatistics.getCurrentBundleStats()let size bundleS…...

在Unreal Engine中,UHT与反射机制

UHT&#xff08;Unreal Header Tool&#xff09; 是虚幻引擎&#xff08;Unreal Engine&#xff09;中的一个重要工具&#xff0c;它用于处理和生成引擎所需的元数据&#xff0c;使得虚幻引擎能够执行许多复杂的功能&#xff0c;如反射、序列化、蓝图交互、垃圾回收等。简而言之…...

SQL项目实战与综合应用——项目设计与需求分析

项目设计与需求分析是软件开发过程中的核心环节&#xff0c;尤其在涉及数据库的应用时&#xff0c;良好的设计将直接影响到项目的可扩展性、性能和维护性。本文将深入探讨数据库设计的最佳实践&#xff0c;结合 C 与 SQL 的实际应用场景&#xff0c;涵盖项目需求收集、数据库设…...

分布式中的CAP定理和BASE理论与强弱一致性

分布式中的CAP定理和BASE理论与强弱一致性 CAP定理 CAP定理&#xff0c;也称为布鲁尔定理&#xff08;Brewer’s Theorem&#xff09;&#xff0c;是由加州大学伯克利分校的Eric Brewer教授在2000年提出的&#xff0c;并由麻省理工学院的Seth Gilbert和Nancy Lynch于2002年正…...

C/C++常见符号与运算符

C/C常见符号与运算符对照表 符号用法与意义与Java类比:在条件运算符中 (cond ? x : y) 表示条件为假的分支&#xff1b;在 switch-case 中如 case 1:表示标签结束点&#xff1b;在自定义标签如 label: 中用于 goto 跳转Java中? :三元运算相同&#xff1b;switch-case中也有:…...

了解 k8s 网络基础知识

了解 Docker 网络模式 在使用 Docker run 创建 Docker 容器时&#xff0c;可以使用 --net 选项指定容器的网络模式&#xff0c;Docker 可以有4种网络模式。 host 模式。–nethost 指定和宿主机共用一个 NetWork Namespace&#xff0c;容器中的网络环境&#xff08;ip 地址、路…...

用户信息界面按钮禁用+发送消息功能

用户信息界面按钮禁用发送消息功能 前言 那么在上一集我们就完成了个人信息窗口所有的内容的修改&#xff0c;那么我们就需要进一步来看我们别的用户的信息界面的窗口。 需求分析 在之前的我们也讲了用户信息界面窗口一共有下图几种组件。 用户头像、用户id、用户昵称、用户…...

接近开关传感器-PCB线图电感式传感器【衰减系数1】

设计和工作原理 衰减系数为1的传感器是在电感式接近开关的基础上装备了特殊的振荡器。传感器内部有两个耦合空心线圈&#xff0c;能够保证根据不同的金属特性作合适的检测调整。无需考虑目标物是不同的金属&#xff0c;因为传感器能在同一感应距离下检测所有金属。 衰减系数为…...

C/C++流星雨

系列文章 序号直达链接1C/C爱心代码2C/C跳动的爱心3C/C李峋同款跳动的爱心代码4C/C满屏飘字表白代码5C/C大雪纷飞代码6C/C烟花代码7C/C黑客帝国同款字母雨8C/C樱花树代码9C/C奥特曼代码10C/C精美圣诞树11C/C俄罗斯方块12C/C贪吃蛇13C/C孤单又灿烂的神-鬼怪14C/C闪烁的爱心15C/C…...

计算机网络:传输层、应用层、网络安全、视频/音频/无线网络、下一代因特网

目录 &#xff08;五&#xff09;传输层 1&#xff0e;传输层寻址与端口 2&#xff0e;无连接服务与面向连接服务 3. 传输连接的建立与释放 4. UDP 的优点 5. UDP 和 TCP 报文段报头格式 6. TCP 的流量控制 7&#xff0e;TCP 的拥塞控制 8. TCP 传送连接的管理 &#…...

[漏洞挖掘与防护] 05.CVE-2018-12613:phpMyAdmin 4.8.1后台文件包含缺陷复现及防御措施

这是作者新开的一个专栏——“漏洞挖掘与防护”,前期会复现各种经典和最新漏洞,并总结防护技巧;后期尝试从零学习漏洞挖掘技术,包括Web漏洞和二进制及IOT相关漏洞,以及Fuzzing技术。新的征程,新的开启,漫漫长征路,偏向虎山行。享受过程,感谢您的陪伴,一起加油~ 欢迎关…...

网站设计培训哪里好/山东服务好的seo公司

大家好&#xff0c;我在洛谷办了一场比赛&#xff0c;欢迎来参加。题目并不难&#xff0c;基本上都是红题&#xff0c;20分钟就写完了&#xff01; 欢迎来报名参加嗷&#xff01; [NOIP1999 普及组] 导弹拦截 题目描述 某国为了防御敌国的导弹袭击&#xff0c;发展出一种导弹…...

牙科医院网站开发/免费发帖推广的平台

一个 nautilus 插件&#xff0c;用于在任意目录中打开终端 nautilus-open-terminal转载于:https://www.cnblogs.com/dirt2/p/5339005.html...

wordpress最新博客主题/奇葩网站100个

重点&#xff1a; 插入数据  INSERT 更新数据  UPDATE 删除数据  DELETE 再来回顾一下之前我们练过的一些操作&#xff0c;相信大家都对插入数据、更新数据、删除数据有了全面的认识。那么在mysql中其实最重要的不是这三大操作&#xff0c;而是 查数据最重要&#xff0c;…...

济南微网站建设/阳山网站seo

为什么80%的码农都做不了架构师&#xff1f;>>> package com.dy.pool;import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors;/*** 在Executors类里面提供了一些静态工厂&#xff0c;生成一些常用的线程池。* 1. newSingleThreadEx…...

八桂云网站建设/已矣seo排名点击软件

2019独角兽企业重金招聘Python工程师标准>>> 安装gcc sudo apt-get install gcc 安装gcc-c 的编译环境 sudo apt-get install build-essential 安装pcre cd pcre-version ./configure make sudo make install 安装zlib cd zlib-version ./configure make sudo make…...

网站自动售卡怎么做/自媒体怎么做

首先调整磁盘大小为60G 注意: 如果虚拟机做快照是无法调节置备大小的,要先删除快照才能调整 点确定后,重启虚拟机OS[rootdownload1 ~] shutdown -r now[rootdownload1 ~]fdisk -lDisk /dev/sda: 64.4 GB, 64424509440 bytes255 heads, 63 sectors/track, 7832 cylindersUnits …...