C++【继承】

C++【继承】

继承

1.继承

1.1 继承的概念

继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许我们在保持原有类特性的基础上进行扩展,增加方法(成员函数)和属性(成员变量),这样产生新的类,称派生类
没使用继承的两个类Student和Teacher,Student和Teacher类里面都有姓名/地址/年龄/电话/住址等成员变量,都有identity身份证的成员函数,设计就开始冗余。

classStudent{public:// 进⼊校园/图书馆/实验室刷⼆维码等⾝份认证voididentity(){// ...}// 学习voidstudy(){// ...}protected: string _name ="peter";// 姓名 string _address;// 地址 string _tel;// 电话int _age =18;// 年龄int _stuid;// 学号};classTeacher{public:voididentity(){// ...}// 授课voidteaching(){//...}protected: string _name ="张三";// 姓名int _age =18;// 年龄 string _address;// 地址 string _tel;// 电话 string _title;// 职称};intmain(){return0;}

下面我们公共的成员都放到Person类中,Student和teacher都继承Person,就可以复用这些成员,就不需要重复定义了,省去了很多麻烦。

classPerson{public:// 进⼊校园/图书馆/实验室刷⼆维码等⾝份认证voididentity(){ cout <<"void identity()"<< _name << endl;}protected: string _name ="张三";// 姓名 string _address;// 地址 string _tel;// 电话int _age =18;// 年龄};classStudent:publicPerson{public:// 学习voidstudy(){// ...}protected:int _stuid;// 学号};classTeacher:publicPerson{public:// 授课voidteaching(){//...}protected: string title;// 职称};intmain(){ Student s; Teacher t; s.identity(); t.identity();return0;}

1.2继承的定义

1.2.1定义格式

Person是基类,也称作父类。Student是派生类,也称作子类。(因为翻译的原因,所以既叫基类/派生类,也叫父类/子类)

在这里插入图片描述


在这里插入图片描述

1.2.2继承基类成员访问方式的变化

类成员/继承方式public继承protected继承private继承
基类的pubic成员派生类的public成员派生类的protected成员派生类的private成员
基类的protected成员派生类的public成员派生类的public成员派生类的public成员
基类的private成员在派生类中不可见在派生类中不可见在派生类中不可见
  • 基类private成员在派生类中无论以什么方式式继承都是不可见的。这里的不可见是指基类的私有成员还是被继承到了派生类对象中,但是语法上限制派生类对象不管在类里面还是类外面都不能去访问它。
  • 基类private成员在派生类中是不能被访问,如果基类成员不想在类外直接被访问,但需要在派生类中能访问,就定义为protected。可以看出保护成员限定符是因继承才出现的。
  • 实际上面的表格我们进行一下总结会发现,基类的私有成员在派生类都是不可见。基类的其他成员在派生类的访问方式 == Min(成员在基类的访问限定符,继承方式),public > protected >private。
  • 使用关键字class时默认的继承方式是private,使用struct时默认的继承方式是public,不过最好显示的写出继承方式。
  • 在实际运用中⼀般使用都是public继承,几乎很少使用protetced/private继承,也不提倡使用protetced/private继承,因为protetced/private继承下来的成员都只能在派生类的类里面使用,实际中扩展维护性不强。

1.3继承模板

namespace jiang {//template<class T>//class vector//{};// stack和vector的关系,既符合is-a,也符合has-atemplate<classT>classstack:public std::vector<T>{public:voidpush(const T& x){// 基类是类模板时,需要指定⼀下类域,// 否则编译报错:error C3861: “push_back”: 找不到标识符// 因为stack<int>实例化时,也实例化vector<int>了// 但是模版是按需实例化,push_back等成员函数未实例化,所以找不到vector<T>::push_back(x);//push_back(x);}voidpop(){vector<T>::pop_back();}const T&top(){returnvector<T>::back();}boolempty(){returnvector<T>::empty();}};}intmain(){ jiang::stack<int> st; st.push(1); st.push(2); st.push(3);while(!st.empty()){ cout << st.top()<<" "; st.pop();}return0;}

2.基类和派生类之间的转换

  • public继承的派生类对象 可以赋值给基类的指针 / 基类的引用。有个形象的说法叫切片或者切割。寓意把派生类中基类那部分切出来,基类指针或引用指向的是派生类中切出来的基类那部分。
  • 基类对象不能赋值给派⽣类对象。

基类的指针或者引用可以通过强制类型转换赋值给派生类的指针或者引用。但是必须是基类的指针是指向派⽣类对象时才是安全的。这里基类如果是多态类型,可以使用RTTI(Run-Time Type Information)的dynamic_cast 来进行识别后进行安全转换。

在这里插入图片描述
intmain(){ jiang::stack<int> st; st.push(1); st.push(2); st.push(3);while(!st.empty()){ cout << st.top()<<" "; st.pop();}return0;}classPerson{protected: string _name;// 姓名 string _sex;// 性别int _age;// 年龄};classStudent:publicPerson{public:int _No;// 学号};intmain(){ Student sobj;// 1.派⽣类对象可以赋值给基类的指针/引⽤ Person* pp =&sobj; Person& rp = sobj;// ⽣类对象可以赋值给基类的对象是通过调⽤后⾯会讲解的基类的拷⻉构造完成的 Person pobj = sobj;//2.基类对象不能赋值给派⽣类对象,这⾥会编译报错 sobj = pobj;return0;}

Read more

Flutter 组件 plural_noun 的适配 鸿蒙Harmony 实战 - 驾驭多语言复数语法转换、实现鸿蒙端国际化文案语义对齐方案

Flutter 组件 plural_noun 的适配 鸿蒙Harmony 实战 - 驾驭多语言复数语法转换、实现鸿蒙端国际化文案语义对齐方案

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 组件 plural_noun 的适配 鸿蒙Harmony 实战 - 驾驭多语言复数语法转换、实现鸿蒙端国际化文案语义对齐方案 前言 在鸿蒙(OpenHarmony)生态的全球化应用开发中,面对上百个涉及金融对账、社交互动计数以及 IoT 设备状态反馈的文案展示。如果仅仅依靠写死的 count > 1 ? 'items' : 'item' 这种硬编码逻辑。那么不仅无法应对如俄语、阿拉伯语中极其复杂的复数变化规则(Case Variation)。更会因为文案在语义层面的“生硬感”引发严重的当地用户体验下降。 我们需要一种“语法感知、逻辑映射”的文本处理艺术。 plural_noun 是一套专注于跨平台应用开发、支持复杂语言复数转换规则的 Dart

By Ne0inhk
Flutter for OpenHarmony:queue 异步任务队列管理(并发控制与任务调度) 深度解析与鸿蒙适配指南

Flutter for OpenHarmony:queue 异步任务队列管理(并发控制与任务调度) 深度解析与鸿蒙适配指南

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net 前言 在 Dart 中,异步操作(Future)通常是并发执行的。如果你在一个 for 循环里发起了 100 个网络请求: for(var url in urls){fetch(url);// 瞬间发出100个请求} 这会导致什么? 1. 服务器爆炸:可能触发 API速率限制(429 Too Many Requests)。 2. 客户端OOM:瞬间创建过多的 Socket 连接和 Buffer。 3. UI 卡顿:大量的 Event Loop 任务阻塞。 我们需要一种机制来限制并发数,或者让任务串行执行。 queue

By Ne0inhk
Flutter 三方库 http_cache_drift_store 的鸿蒙化适配指南 - 实现基于 Drift 的高性能 HTTP 缓存控制、支持本地持久化网络内容与端侧弱网访问体验优化

Flutter 三方库 http_cache_drift_store 的鸿蒙化适配指南 - 实现基于 Drift 的高性能 HTTP 缓存控制、支持本地持久化网络内容与端侧弱网访问体验优化

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 http_cache_drift_store 的鸿蒙化适配指南 - 实现基于 Drift 的高性能 HTTP 缓存控制、支持本地持久化网络内容与端侧弱网访问体验优化 前言 在进行 Flutter for OpenHarmony 开发时,网络请求的响应速度和在离线状态下的可用性直接决定了应用的品质。虽然内存缓存能解决部分问题,但退出应用即消失。http_cache_drift_store 是一款强大的持久化缓存库,它利用 Drift(原 moor)这一高性能 SQL 引擎作为存储底座,为 HTTP 请求提供了坚固的“本地镜像”。本文将探讨如何在鸿蒙端构建极致的网络数据缓存层。 一、原原理性解析 / 概念介绍 1.1

By Ne0inhk

macos如何升级到指定版本,而不是默认最新的版本。我的现在为15.3,如何升级到15.4,而不是最新的15.54

明白了,你想从 macOS 15.3 升级到 15.4,而不想升级到 15.5。 ❗苹果的默认行为:只提供最新版 苹果的 “系统设置 → 软件更新” 会默认只提供最新版本(目前是 15.5),不支持选择旧版本(比如 15.4)。 不过,有办法可以手动下载并安装 macOS 15.4 安装器,你可以绕过这一限制。 ✅ 方法:使用终端命令下载 macOS 15.4 安装器 步骤: 1. 打开 终端(Terminal) 2. 运行以下命令(需要管理员权限): softwareupdate --fetch-full-installer --full-installer-version 15.4

By Ne0inhk