【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.xdnf.cn/news/9839.html

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

相关文章

PVE纵览-备份与快照指南

PVE纵览-备份与快照指南 文章目录 PVE纵览-备份与快照指南摘要1 备份与快照概述定义与区别备份与快照在PVE中的应用场景 2 PVE 备份功能详解备份类型与策略配置备份任务自动化备份管理 3 PVE 快照功能详解快照的工作原理快照的创建与恢复机制快照对系统性能的影响快照的使用场景…

Android JNI 技术入门指南

引言 在Android开发中&#xff0c;Java是一种主要的编程语言&#xff0c;然而&#xff0c;对于一些性能要求较高的场景&#xff08;如音视频处理、图像处理、计算密集型任务等&#xff09;&#xff0c;我们可能需要使用到C或C等语言来编写底层的高效代码。为了实现Java代码与C…

供应商srm管理,招投标管理,电子采购管理,在线询价,在线报价,供应商准入审核(java代码)

前言&#xff1a; 随着互联网和数字技术的不断发展&#xff0c;企业采购管理逐渐走向数字化和智能化。数字化采购平台作为企业采购管理的新模式&#xff0c;能够提高采购效率、降低采购成本、优化供应商合作效率&#xff0c;已成为企业实现效益提升的关键手段。系统获取在文末…

Java 函数接口Supplier【供给型接口】简介与示例

Java中四个重要的函数式接口&#xff1a;Function、Predicate、Consumer和Supplier。这些接口是函数式编程的基础&#xff0c;Function用于转换操作&#xff0c;Predicate用于进行条件判断&#xff0c;Consumer用于消费输入而不产生输出&#xff0c;而Supplier则用于提供值但不…

线程与进程的区别(面试)

一.进程 进程&#xff1a;一个程序启动起来&#xff0c;就会对应一个进程&#xff0c;进程就是系统分配资源的基本单位。 上面一部分进程是我们自己去执行应用的可执行文件, 而另一部分是操作系统自动启动的进程. 二.线程 线程&#xff1a;线程是进程中的一个执行单元&#xff…

VMware调整窗口为可以缩小但不改变显示内容的大小

也就是缩小窗口不会影响内容的大小 这样设置就好

OpenAI 发布了新的事实性基准——SimpleQA

SimpleQA 简介 名为 SimpleQA 的事实性基准&#xff0c;用于衡量语言模型回答简短的事实性问题的能力。 人工智能领域的一个悬而未决的问题是如何训练模型&#xff0c;使其产生符合事实的回答。 目前的语言模型有时会产生错误的输出或没有证据证明的答案&#xff0c;这个问题…

酒店民宿小程序,探索行业数字化管理发展

在数字化发展时代&#xff0c;各行各业都开始向数字化转型发展&#xff0c;酒店民宿作为热门行业也逐渐趋向数字、智能化发展。 对于酒店民宿来说&#xff0c;如何将酒店特色服务优势等更加快速运营推广是重中之重。酒店民宿小程序作为一款集结预约、房源管理、客户订单管理等…

[C++11] 可变参数模板

文章目录 基本语法及原理可变参数模板的基本语法参数包的两种类型可变参数模板的定义 sizeof... 运算符可变参数模板的实例化原理可变参数模板的意义 包扩展包扩展的基本概念包扩展的实现原理编译器如何展开参数包包扩展的高级应用 emplace 系列接口emplace_back 和 emplace 的…

使用Ubuntu快速部署MinIO对象存储

想拥有自己的私有云存储&#xff0c;安全可靠又高效&#xff1f;MinIO是你的理想选择&#xff01;这篇文章将手把手教你如何在Ubuntu 22.04服务器上部署MinIO&#xff0c;并使用Nginx反向代理和Let’s Encrypt证书进行安全加固。 即使你是新手&#xff0c;也能轻松完成&#xf…

贝尔不等式,路径积分与AB(Aharonov-Bohm)效应

贝尔不等式、路径积分与Aharonov-Bohm&#xff08;AB&#xff09;效应 这些概念分别源于量子力学不同的理论分支和思想实验&#xff0c;但它们都揭示了量子力学的奇异性质&#xff0c;包括非局域性、相位效应和波粒二象性。以下详细解析每一概念&#xff0c;并探讨其相互联系。…

用友U8接口-isHasCounterSignPiid错误

错误消息 调用U813的审批流方法报错&#xff0c;找不到方法:“Boolean UFIDA.U8.Audit.BusinessService.ManualAudit.isHasCounterSignPiid System.Web.Services.Protocols.SoapException:服务器无法处理请求。 ---> System.MissingMethodException: 找不到方法:“Boolean…

QJson-趟过的各种坑(先坑后用法)

QJson-趟过的各种坑【先坑后用法】 Chapter1 QJson-趟过的各种坑【先坑后用法】一、不能处理大数据量&#xff0c;如果你的数据量有百兆左右(特别是有的小伙伴还喜欢json格式化输出的)&#xff0c;不要用Qjson&#xff0c;否则会报错 DocumentTooLarge二、json格式化输出1.构建…

flink实战-- flink任务的火焰图如何使用

火焰图 Flame Graphs 是一种有效的可视化工具,可以帮助我们排查如下问题: 目前哪些方法正在消耗 CPU 资源?一个方法的消耗与其他方法相比如何?哪一系列的堆栈调用导致了特定方法的执行?y 轴表示调用栈,每一层都是一个函数。调用栈越深,火焰就越高,顶部就是正在执行的…

.Net Core 6.0 WebApi在Centos中部署

查看已经开发的端口的列表 firewall-cmd --zonepublic --list-ports .net core sdk密匙 sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm sudo yum update .net core sdk安装 sudo yum install -y dotnet-sdk-6.0 sudo dnf in…

Java基于SpringBoot+Vue的农产品电商平台

大家好&#xff0c;我是Java徐师兄&#xff0c;今天为大家带来的是Java基于SpringBoot 的农产品电商平台。该系统采用 Java 语言 开发&#xff0c;MySql 作为数据库&#xff0c;系统功能完善 &#xff0c;实用性强 &#xff0c;可供大学生实战项目参考使用。 博主介绍&#xff…

一文读懂系列:结合抓包分析,详解SSH协议通信原理

SSH协议通过建立加密通道来提供安全的远程访问、文件传输和执行远程命令等操作。接下来我们就通过具体示例和抓包分析&#xff0c;让大家清楚地了解SSH协议的神秘面纱&#xff01;如有更多疑问&#xff0c;欢迎讨论区留言讨论~ 1. SSH简介 SSH&#xff08;Secure Shell&#x…

数据冒险-ld和add(又称load-use冒险)

第一张图没有使用前递&#xff0c;第二张图使用前递&#xff0c;chatgpt分析第二张图 这张图展示了一个流水线的执行过程&#xff0c;其中存在读后写&#xff08;RAW&#xff09;数据冒险。我们可以通过**前递&#xff08;Forwarding&#xff09;**技术来解决这个数据冒险&…

Java 的 Scanner 类:控制台输入与文件扫描

Java 的 Scanner 类是一个非常方便的工具类&#xff0c;主要用于从控制台或文件中扫描输入数据。虽然它也可以用于扫描文件内容&#xff0c;但我们通常更喜欢它用于控制台输入&#xff0c;因为扫描文件可以通过文件流来完成。接下来&#xff0c;我们将通过几个简单的示例来讲解…

安卓市场如何做APP的分发、推广?

今天主要跟大家分享一些分发、推广这块操作的内容以及对安卓用户的一些理解。 分发的日常生活&#xff1a;“某渠道怎样怎样&#xff0c;应用宝是不是要加点预算&#xff0c;OPPO是不是要加点预算&#xff0c;你的成本又高了&#xff0c;华为又掉注册&#xff0c;应用宝又掉注册…