【C++课程学习】:继承(上)(详细讲解)

🎁个人主页:我们的五年

🔍系列专栏:C++课程学习

🎉欢迎大家点赞👍评论📝收藏⭐文章

 

目录

一.继承的概念和定义

🎄继承的概念:

🎄继承的定义:

基本概念:

基本格式:

🎄继承基类成员访问方式的变化(九种):

二.基类和派生类对象赋值转换

三.继承中的作用域

🥊隐藏:


 

一.继承的概念和定义

🎄继承的概念:

继承是面向对象程序设计使代码可以复用的重要手段,它允许在原有类的基础上进行拓展,增加功能,形成新的类。

继承体现了面向对象程序设计的层次结构。继承是类设计层级的复用。

🎄继承的定义:

//基类(父类)
class person {
private:string _name;
};//派生类(子类)
class student:public person
{//子类拓展的内容
};

基本概念:

由🌷1.派生类(子类),🌷2.基类(父类),🌷3.继承方式(可省略),构成。

子类:子类也可叫做派生类,是在继承父类(基类)以后生成的新类。

父类:原来的基础类。

继承方式:以哪种方式进行继承,继承的方式有三种:public,protected,private。

当不写的时候:

1.派生类是class,那么继承方式就是private(私有继承)。

2.派生类是struct,继承方式就是public(公有继承)。

基本格式:

下面的student是派生类,继承方式是:public(共有继承),基类是person。

🎄继承基类成员访问方式的变化(九种):

 

⏰1.规律:基类的private(私有)都是不可见,其他的:在派生类的访问方式=min(在基类的访问方式,继承方式)。

public>protected>private。

例如,基类的public成员,以private继承,在基类的访问方式=min(public,private)=private。

⏰2.基类的private成员无论以哪种方式继承,在派生类中都是不可见的。这里的不可见是指,虽然在派生类中继承下来,但是在派生类里,还是在类外面都是不能访问。

⏰3.如果基类的成员想被子类访问,不想被类外访问,那么把基类的成员定义为protected就可以了。也就是说,protected是在继承才出现的,在其他的地方,protected和private基本差不多。

⏰4.当不写的时候:(实际中还是写出继承方式比较好)

1.派生类是class,那么继承方式就是private(私有继承)。

2.派生类是struct,继承方式就是public(公有继承)。

⏰5.在实际中,一般的继承方式都是public,因为其他两种继承,会把基类的访问方式缩小。这个子类去生成新的子类的时候,拓展性就不高了。

二.基类和派生类对象赋值转换

●派生类对象可以赋值给基类的对象 / 基类的指针 / 基类的引用。这里可以看成切片或者切隔,还是指向派生类的。

●基类对象不能赋值给派生类对象。

●基类的指针和引用可以强制类型转化赋值给派生类的指针或者引用。但是必须是基类的指针或者引用是指向派生类才是安全的。

class person
{
protected:string _name; // 姓名string _sex; // 性别int _age; // 年龄
};class student : public person
{
public:int _No; // 学号
};void Test()
{student st;// 1.子类对象可以赋值给父类对象/指针/引用person p = st;person* pp = &st;person& rp = st;//2.基类对象不能赋值给派生类对象//sobj = p;// 3.基类的指针可以通过强制类型转换赋值给派生类的指针pp = &st;student* ps1 = (student*)pp;	// 这种情况转换时可以的。ps1->_No = 10;pp = &p;student* ps2 = (student*)pp; // 这种情况转换时虽然可以,但是会存在越界访问的问题ps2->_No = 10;
}

 下面最后一种情况时,pp先取一个student的地址,然后再强制类型转换给一个student类型的ps1,然后通过ps1去访问_No,不会发生越界。如果先取的也是person类型的地址,就会发生越界。

我的理解是,C++允许子类的指针给父类的指针,上面不越界的情况,是原来他是属于student,除person外那块空间可能进行特殊处理,表示如果再次转换回student就不会报错。

void test()
{student st;st._No = 123;person* pp = &st;student* ps1 = (student*)pp;	cout << ps1->_No << endl;
}

三.继承中的作用域

目前我学过的域有:全局域,类域,局部域,命名空间域。

在同一域中:

●不能有相同的变量名,即使他们的类型不同。

●可以有同名函数存在,但是参数列表不同,他们构成重载。

在两个域中:

●可以有相同的变量名。

●可以有函数原型相同的函数。


●在父类和子类中,他们两个都是单独的作用域

●在父类和子类中(一个函数在父类,一个函数在子类),可以有函数原型一样的函数,他们构成隐藏。也叫重定义。


🥊隐藏:

🥅隐藏的概念:

子类屏蔽对父类同名函数的访问,如果要访问,需要在函数前面写父类,表示在父类去找。

不然如果你想用父类的那个同名函数,如果不显示指定,子类的对象调用时,编译器只会在子类中找,不会因为不匹配,而去父类找,如果不匹配,直接编译不通过。

基类::基类成员        进行显示访问!

class A
{
public:void fun(){cout << "func()" << endl;}
};
class B : public A
{
public:void fun(int i){A::fun();cout << "func(int i)->" << i << endl;}
};void test()
{B b;b.fun();    //没有指定类域,编译器只会在子类中找,不匹配直接编译出错b.A::fun();
}

 

●在父类和子类中,只要两个函数的函数名相同就构成隐藏。

●在实际中,不建议在父类,子类写同名的函数。

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

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

相关文章

Linux笔记之pandoc实现各种文档格式间的相互转换

Linux笔记之pandoc实现各种文档格式间的相互转换 code review! 文章目录 Linux笔记之pandoc实现各种文档格式间的相互转换1.安装 Pandoc2.Word转Markdown3.markdown转html4.Pandoc 支持的一些常见格式4.1.输入格式4.2.输出格式 1.安装 Pandoc sudo apt-get install pandoc # …

封装的数字滚动组件的实现代码

效果&#xff1a; 学习啦&#xff1a; Vue 是一个渐进式框架&#xff0c;鼓励通过组件化来构建应用&#xff0c;其组件化优势&#xff1a; 代码复用&#xff1a;不同的视图和功能被封装成独立的组件&#xff0c;便于复用。易于维护&#xff1a;每个组件职责单一、耦合度低&…

Kafka面试题解答(二)

1.怎么尽可能保证 Kafka 的可靠性 kafka是可能会出现数据丢失问题的&#xff0c;Leader维护了一个动态的in-sync replica set&#xff08;ISR&#xff09;&#xff0c;意为和 Leader保持同步的FollowerLeader集合(leader&#xff1a;0&#xff0c;isr:0,1,2)。 如果Follower长…

分块——最为优雅的暴力

在信息学竞赛中&#xff0c;常常会遇到一些区间修改或区间查询的题目&#xff0c;如果直接敲暴力的话&#xff0c;时间复杂度是 O ( n m ) O(nm) O(nm) 可能会超时&#xff0c;如果写树状数组或线段树的话&#xff0c;又有一点复杂&#xff0c;不易理解&#xff0c;那么这时候…

w~视觉~合集20~SAM

我自己的原文哦~ https://blog.51cto.com/whaosoft/12500982 #SAM 今天&#xff0c;Meta发布史上首个图像分割基础模型SAM&#xff0c;将NLP领域的prompt范式引进CV&#xff0c;让模型可以通过prompt一键抠图。网友直呼&#xff1a;CV不存在了! 就在刚刚&#xff0c;Meta AI…

Halcon resistor.hedv 使用多个对焦级别提取深度

depth_from_focus * Extract depth using multiple focus levels * 使用多个对焦级别提取深度 Names : [] * 初始化一个空数组&#xff0c;用于存储图像名称 dev_close_window () * 关闭当前打开的图像窗口 for i : 1 to 10 by 1 * 循环开始&#xff0c;从1到10 …

qt QTreeWidgetItem详解

1、概述 QTreeWidgetItem 是 Qt 框架中的一个类&#xff0c;专门用于在 QTreeWidget&#xff08;一个基于项的树形视图&#xff09;中表示单个节点&#xff08;或称为项&#xff09;。QTreeWidget 继承自 QAbstractItemView&#xff0c;而 QTreeWidgetItem 则作为树中的一个节…

三.Linux用户和用户管理

前言&#xff1a;Linux系统是一个多用户多任务的分时操作系统&#xff0c;任何一个要使用资源的都必须向系统管理员申请一个账户&#xff0c;然后通过这个账户的身份进入系统。 一.此次目的 用户账号的添加、删除与修改。 用户口令的管理。 用户组的管理。 二.用户账号的添加…

SpringBoot技术栈:构建高效共享汽车系统

4系统概要设计 4.1概述 本系统采用B/S结构(Browser/Server,浏览器/服务器结构)和基于Web服务两种模式&#xff0c;是一个适用于Internet环境下的模型结构。只要用户能连上Internet,便可以在任何时间、任何地点使用。系统工作原理图如图4-1所示&#xff1a; 图4-1系统工作原理…

【笔记】扩散模型(九):Imagen 理论与实现

论文链接&#xff1a;Photorealistic Text-to-Image Diffusion Models with Deep Language Understanding 非官方实现&#xff1a;lucidrains/imagen-pytorch Imagen 是 Google Research 的文生图工作&#xff0c;这个工作并没有沿用 Stable Diffusion 的架构&#xff0c;而是级…

css:基础

前言 我们之前其实也可以写出一个看起来算是一个网页的网页&#xff0c;为什么我们还要学css&#xff1f; CSS&#xff08;Cascading Style Sheets&#xff09;也叫层叠样式表&#xff0c;是负责美化的&#xff0c;我们之前说html就是一个骨架&#xff0c;css就可以用来美化网…

[全网最细数据结构完整版]第七篇:3分钟带你吃透队列

目录 1->队列的概念及结构 2->队列的实现 2.1定义队列基本结构 struct QueueNode 和 struct Queue 2.2队列初始化函数 QueueInit 函数 2.3队列销毁函数 QueueDestroy 函数 2.4队列插入数据函数 QueuePush 函数 2.5判断队列是否为空,空返回true,非空返回false 2.6队列删…

Android笔记(三十五):用责任链模式封装一个App首页Dialog管理工具

背景 项目需要在首页弹一系列弹窗&#xff0c;每个弹窗是否弹出都有自己的策略&#xff0c;以及哪个优先弹出&#xff0c;哪个在上一个关闭后再弹出&#xff0c;为了更好管理&#xff0c;于是封装了一个Dialog管理工具 效果 整体采用责任链模块设计&#xff0c;控制优先级及弹…

掌握软件组件/单元测试中的这些术语,你就算正式入门了

上篇干货&#xff0c;和大家分享了软件测试的几个级别&#xff0c;在【组件/单元测试】当中&#xff0c;涉及不少名词术语。从之前的学员学习过程来看&#xff0c;这里比较容易出现概念混乱&#xff0c;进而导致面试过程中频频翻车&#xff0c;所以有必要在这里单独拎出来和大家…

html的week控件 获取周(星期)的第一天(周一)和最后一天(周日)

html的week控件 获取周(星期)的第一天(周一)和最后一天(周日) <input type"week" id"week" class"my-css" value"ViewBag.DefaultWeek" /><script> function PageList() { var dateStrin…

【主机游戏】艾尔登法环游戏攻略

艾尔登法环&#xff0c;作为一款备受好评但优化问题频发的游戏&#xff0c;就连马斯克都夸过 今天介绍一下这款游戏 https://pan.quark.cn/s/24760186ac0b 角色升级 在《艾尔登法环》中&#xff0c;角色升级需要找到梅琳娜。你可以在关卡前废墟的营地附近&#xff0c;风暴关…

CSS 中三角形的绘制方法详解

在网页设计领域&#xff0c;特殊形状常常能为页面增添独特的视觉效果&#xff0c;三角形便是其中之一。本文将详细介绍如何利用 CSS 绘制三角形。 一、原理阐述 CSS 中一个元素的边框分为上边框、右边框、下边框和左边框。当把一个元素的宽度和高度设为 0&#xff0c;且只让其…

虚拟机linux7.9下安装mysql

1.MySQL官网下载安装包&#xff1a; MySQL :: Download MySQL Community Server https://cdn.mysql.com/archives/mysql-5.7/mysql-5.7.39-linux-glibc2.12-x86_64.tar.gz 2.解压文件&#xff1a; #tar xvzf mysql-5.7.39-linux-glibc2.12-x86_64.tar.gz 3.移动文件&#…

负载均衡式在线oj项目开发文档(个人项目)

项目目标 需要使用的技术栈&#xff1a; 这个项目共分成三个模块第一个模块为公共的模块&#xff0c;用于解决字符串处理&#xff0c;文件操作&#xff0c;网络连接等等的问题。 第二个模块是一个编译运行的模块&#xff0c;这个模块的主要功能就是将用户的代码收集上来之后要…

MySQL数据库专栏(五)连接MySQL数据库C API篇

摘要 本篇文章主要介绍通过C语言API接口链接MySQL数据库&#xff0c;各接口功能及使用方式&#xff0c;辅助类的封装及调用实例&#xff0c;可以直接移植到项目里面使用。 目录 1、环境配置 1.1、添加头文件 1.2、添加库目录 2、接口介绍 2.1、MySql初始化及数据清理 2.1.…