继承的内容

封装:
1.在类中,把数据和方法放在一起,只展示成员函数,不展示定义的数据为私有。
2.一个类型放到另一个类型里面,通过typedef成员函数调整,封装另一个全新的类型。相当于是一个包装。

继承:
struct 和 class 都可以继承。struct 默认的继承方式和访问限定符都是公有,class 的都是私有。
继承机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称为派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程,以前都是函数复用,继承使类设计层次的复用。也就是说,对于很多都会共有的信息放在一个大类中,然后对于各个对象而言,想创建自己的信息类,可以继承一下大类,再添加一些自己特有的信息就行了。
下图中,人这个类就是基类,学生,工人,保安就是派生类。
在这里插入图片描述
继承的写法如下述代码所示:再代码中,基类的name和age都是portected,因此都是受保护的可以继承,继承后不能修改,但如果是基类的私有成员,继承后派生类中不可见。

class Person
{
public:void Print(){cout << "name:" << _name << endl;cout << "age:" << _age << endl;}
protected:string _name = "peter"; // 姓名int _age = 18;  // 年龄
};
class Student : public Person
{
protected:int _stuid; // 学号
};
class Teacher : public Person
{
protected:int _jobid; // 工号
};

基类的public成员则派生类怎样继承就是怎样的成员。
基类的protected成员派生类public和protected继承都是protected成员,private继承就是private成员。protected成员公有继承后是在类内函数可以访问的,类外的对象不能直接调用。
基类的private成员派生类怎样继承都是不可见(不能被直接访问)成员,但如果父类有public函数可以调用父类私有成员的话,可以在派生类中调用父类中的public成员去访问父类私有成员。
基类的其他成员在子类的访问方式 == Min(成员在基类的访问限定符,继承方式),public > protected > private。

在公有继承的情况下,基类的公有成员可以在派生类的类内和类外直接访问。基类的保护成员可以在类内函数访问,类外不能访问。基类的私有成员在派生类的类内和类外都不能直接访问,需要通过派生类在类内调用基类的公有函数去访问。

基类和派生类对象赋值转换
在 public 继承的情况下,每个子类都是一个特殊的父类,只需要把子类中父类具有的信息切出来然后给父类就行了。而且会进行赋值兼容。
基类不能给派生类赋值。多的可以给少的,少的不能给多的。
基类和派生类都有独立作用域,子类和父类可以定义同名成员,但子类成员会屏蔽父类同名成员的直接访问,叫做隐藏。要想访问 - - - 基类::基类成员 - - - 这种方式显示访问。

同一个作用域才会重载,父子类中的同名函数就不可能构成重载,因为父子类就不是一个作用域。只要是父子类的成员函数,只看函数名,函数名相同就是隐藏,参数可同可不同。

在派生类中,构造函数的特征是父类+自己,父类的调用父类构造函数初始化(复用),可以把父类成员当成一个整体规定调用默认构造,子类成员为内置类型和自定义类型。

就是说在子类对象的构造中中,父类就是当成子类的一个自定义类型就可以了,一般按照自定义类型处理父类成员。

对于下述代码,对于Student中对Perason的操作都是去从子类中调用父类的四大函数就行了。子类的赋值、析构也会隐藏父类。
构造是先父后子,析构得保证先子后父。
如果在子类的析构函数中显式调用父类析构函数,就绝对是先父后子的析构顺序,因此必须得自动调用,不要去自己写。子类调用结束后会自动调用父类析构。

class Person
{
public:Person(const char* name): _name(name){cout << "Person()" << endl;}Person(const Person& p): _name(p._name){cout << "Person(const Person& p)" << endl;}Person& operator=(const Person& p){cout << "Person operator=(const Person& p)" << endl;if (this != &p)_name = p._name;return *this;}~Person(){cout << "~Person()" << endl;}void Print(){cout << "name:" << _name << endl;}protected:string _name = "peter"; // 姓名
};
class Student : public Person
{
public:Student(int num, const char* str, const char* name):Person(name), _num(num), _str(str){cout << "Student()" << endl;}Student(const Student& s) :Person(s) //子类对象可以赋值给父类,就把子类对象自然切割就给父类了, _num(s._num), _str(s._str){}Student& operator=(const Student& s){if (this != &s){Person::operator=(s); //继承后会隐藏父类operator=,因此得显示调用_num = s._num;_str = s._str;}return *this;}~Student(){// 显示写无法先子后父//Person::~Person();cout << _name << endl;cout << "~Student()" << endl;// 注意,为了析构顺序是先子后父,子类析构函数结束后会自动调用父类析构}
protected:int _num;string _str;
};int main()
{Person p("peter");Person p1(p);Student s1(1, "xxxx", "张三");Student s2(s1);Student s3 = s2;return 0;
}

如果基类内中有静态成员,则这个静态成员属于当前类和所有继承类,也就是说只有一份静态成员。
如:下述代码中p和s只有一份_count

class Person
{
public:Person() { ++_count; }
protected:string _name; // 姓名
public:static int _count; // 统计人的个数。
};
int Person::_count = 0;
class Student : public Person
{
protected:int _stuNum; // 学号
};
class Graduate : public Student
{
protected:string _seminarCourse; // 研究科目
};
void TestPerson()
{Student s;Person p; // p和s只有一份count
}

菱形继承:
菱形继承的问题:从下面的对象成员模型构造,可以看出菱形继承有数据冗余和二义性的问题。在Assistant的对象中Person成员会有两份。如果Person中有sex 和 年龄等信息,只有一份,但是集成到Assistant就会产生数据冗余和二义性的问题。
在这里插入图片描述
菱形继承可以指定访问临时解决二义性的问题。下述代码为面对上图的情况:

void Test ()
{// 这样会有二义性无法明确知道访问的是哪一个Assistant a ;a._name = "peter"; //无法访问// 需要显示指定访问哪个父类的成员可以解决二义性问题,但是数据冗余问题无法解决a.Student::_name = "xxx";a.Teacher::_name = "yyy";
}

菱形继承是一个极其复杂的东西,不建议使用。
虚拟继承(virtual)可以解决菱形继承的二义性和数据冗余的问题。如上面的继承关系,在Student和Teacher的继承Person时使用虚拟继承,即可解决问题。需要注意的是,虚拟继承不要在其他地方去使用。
在这里插入图片描述

假设有一个A类,B、C类虚拟继承A类,然后D类继承B、C类。每个类存放各自的成员为int a\b\c\d。
下图可以看到:也就是说,虚拟继承后存放了一个新的内容,这个地址的内容加上自己本身的地址,就指向了最早的存放A类的地址。
存放的内容就是切片时的指针偏移量。
在这里插入图片描述

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

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

相关文章

设计模式之结构型模式---装饰器模式

目录 1.概述2.类图3.应用场景及优缺点3.1 应用场景3.2 优缺点3.2.1 优点3.2.2 缺点 4.实现4.1 案例类图4.2 代码实现4.2.1 定义抽象构建角色4.2.2 定义具体构建角色4.2.3 定义抽象装饰器角色4.2.4 定义具体装饰角色4.2.5 装饰器模式的使用 1.概述 装饰器模式是指在不改变现有对…

接口测试(十一)jmeter——断言

一、jmeter断言 添加【响应断言】 添加断言 运行后&#xff0c;在【察看结果树】中可得到&#xff0c;响应结果与断言不一致&#xff0c;就会红色标记

vue-i18n国际化多国语言i18n国际语言代码对照表

uniapp是自带有i18n这个插件 需要自己去给每一个需要国际化的字符去手动配置key&#xff0c;所以如果是已经完成的项目可能工作量就稍微有点大了 第一步&#xff1a; 语言命名是有规范的不能乱取名&#xff0c;具体可以参考国际语言代码 i18n国际语言代码对照表 zh_CN 中文(简体…

GitHub | 发布到GitHub仓库并联文件夹的方式

推送到Github 推送步骤如果你只想更新单个文件&#xff0c;只需在第 4 步中指定该文件的路径即可。可能问题一 效果 推送步骤 更新 GitHub 仓库中的文件通常涉及以下步骤&#xff1a; 克隆仓库&#xff1a; 首先&#xff0c;你需要将 GitHub 上的仓库克隆到本地。使用 git …

Docsify文档编辑器:Windows系统下个人博客的快速搭建与发布公网可访问

文章目录 前言1. 本地部署Docsify2. 使用Docsify搭建个人博客3. 安装Cpolar内网穿透工具4. 配置公网地址5. 配置固定公网地址 前言 本文主要介绍如何在Windows环境本地部署 Docsify 这款以 markdown 为中心的文档编辑器&#xff0c;并即时生成您的文档博客网站&#xff0c;结合…

杂货 | 每日资讯 | 2024.11.1

注意&#xff1a;以下内容皆为AI总结 2024年11月1日&#xff0c;人工智能&#xff08;AI&#xff09;领域发生了多项重要事件&#xff0c;标志着技术发展的新阶段。本文将详细探讨以下三大事件&#xff1a; OpenAI为ChatGPT新增搜索功能IEEE发布《2025年及以后的技术影响》报…

RuoYi 样例框架运行步骤(测试项目自用,同学可自取)

目录 后台 API 运行导入&#xff0c;下载包端口号mysql 准备运行 PC&#xff08;电脑端&#xff09;运行安装 nodejs安装 yarn 及其依赖&#xff0c;启动服务登录admin(admin123) 或 ry(admin123) App&#xff08;移动&#xff09;运行下载 HBuilderX运行app运行注意&#xff1…

Puppeteer点击系统:解锁百度流量点击率提升的解决案例

在数字营销领域&#xff0c;流量和搜索引擎优化&#xff08;SEO&#xff09;是提升网站可见性的关键。我开发了一个基于Puppeteer的点击系统&#xff0c;旨在自动化地提升百度流量点击率。本文将介绍这个系统如何通过模拟真实用户行为&#xff0c;优化关键词排名&#xff0c;并…

项目解决方案:跨不同的物理网络实现视频监控多画面的实时视频的顺畅访问

目录 一、碰到的需求问题 二、需求分析 三、方案分析 &#xff08;一&#xff09;方法1&#xff1a;使用HTTP代理 1. 安装HTTP代理服务器 2. 配置Nginx代理 3. 重启Nginx 4. 访问视频流 &#xff08;二&#xff09;方法2&#xff1a;使用反向代理 1. 安装反向代理服务…

MQTT自动发送消息工具(自动化测试MQTT)

点击下载《MQTT客户端服务端工具》 点击下载《MQTT自动发送消息软件(自动化测试MQTT)》 1. 前言 在软件开发过程中&#xff0c;MQTT常被用作消息队列来完成特定的业务功能。当我们将相关业务代码编写完成后&#xff0c;通常需要编写额外的消息生产和消费代码来模拟消息高峰时…

东北虎豹国家公园shp格式范围

东北虎豹国家公园地处中国吉林、黑龙江两省交界的老爷岭南部&#xff08;珲春—汪清—东宁—绥阳&#xff09;区域&#xff0c;东起吉林省珲春林业局青龙台林场&#xff0c;与俄罗斯滨海边疆区接壤&#xff0c;西至吉林省大兴沟林业局岭东林场&#xff0c;南自吉林省珲春林业局…

练习LabVIEW第三十七题

学习目标&#xff1a; 刚学了LabVIEW&#xff0c;在网上找了些题&#xff0c;练习一下LabVIEW&#xff0c;有不对不好不足的地方欢迎指正&#xff01; 第三十七题&#xff1a; 利用XY GRAPH 构成李萨如图形 开始编写&#xff1a; 前面板放一个XY图控件&#xff0c;程序框图…

Pandas 数据可视化指南:从散点图到面积图的全面展示

Pandas 数据可视化指南&#xff1a;从散点图到面积图的全面展示 本文介绍了使用 Pandas 进行数据可视化的多种方法&#xff0c;包括散点图、折线图、条形图、直方图、饼图和面积图等&#xff0c;涵盖了常见的图表类型及其实现方式。通过提供详细的代码示例&#xff0c;展示了如…

Solana链上的Pump狙击机器人与跟单机器人的工作原理及盈利模式

随着加密货币市场的快速发展&#xff0c;越来越多的投资者和开发者开始关注Solana链上的自动化交易工具。尤其是Pump狙击机器人和跟单机器人&#xff0c;这两种工具为用户提供了在市场波动中获取利润的机会。本文将深入分析这两种机器人的工作原理及其盈利模式。 一、Pump狙击机…

嵌入式操作系统FreeRTOS

系列文章目录 嵌入式操作系统FreeRTOS 嵌入式操作系统FreeRTOS 系列文章目录一、FreeRTOS 一、FreeRTOS 首先看一下 FreeRTOS 的名字&#xff0c;可以分为两部分&#xff1a;“Free”和“RTOS”&#xff0c;“Free”就是免费的、自由的、不受约束的意思&#xff0c;“RTOS”全…

客如云:大型业务报表的分区化改造提升性能|OceanBase 应用实践

一 概述 1 背景 在过去两到三年的时间里&#xff0c;客如云的KPOS产品在商户数量和订单量均实现了数倍的增长&#xff0c;充分展示了产品的市场吸引力和业务模式的成功。然而&#xff0c;随着更多的大型连锁商户的加入&#xff0c;客如云商家平台迎来了前所未有的挑战。特别是…

Vue2指令原理手写

文件结构 index.js /** Author: RealRoad* Date: 2024-10-31 17:13:50* LastEditors: Do not edit* LastEditTime: 2024-10-31 17:15:57* Description: * FilePath: \project_10_08\vite-project\src\testVue\index.js*/ import Vue from ./Vue.js window.VueVue Vue.js imp…

手游和应用出海资讯:可灵AI独立APP即将上架;Rollic在英国推出芭比合并解谜手游

NetMarvel帮助游戏和应用广告主洞察全球市场、获取行业信息&#xff0c;以下为10月第四周资讯&#xff1a; ● 苹果开发全新游戏中心应用 ● Meta计划开发人工智能搜索引擎 ● 微软已拥有20个游戏IP&#xff0c;收入达10亿美元 ● OpenAI计划在12月推出其下一代前沿模型Orion ●…

笔记-利率学习记录

利率、通货膨胀与经济运行 利率政策的经济效应 假设所有利率一样&#xff0c;把利率降到 0 会带来一系列影响&#xff1a; 降低储蓄意愿&#xff1a;随着利率接近于 0&#xff0c;人们存钱的收益减少&#xff0c;倾向于消费和投资。增加企业盈利&#xff1a;融资成本降低&…

九,数据类型存储

1、简单类型与复杂类型 简单类型又叫做基本数据类型或者值类型&#xff0c;复杂类型又叫做引用类型 值类型&#xff1a;简单数据类型/基本数据类型&#xff0c;在存储时变量中存储的时值本身&#xff0c;因此叫做值类型 string、number、boolean、undefined、null 注意&…