继承【C/C++复习版】
目录
一、什么是继承?怎么定义继承?
二、继承关系和访问限定符?
三、基类和派生类对象可以赋值转换吗?
四、什么是隐藏?隐藏vs重载?
五、派生类的默认成员函数?
1)派生类构造函数怎么写?
2)派生类拷贝构造函数怎么写?
3)派生类operator=怎么写?
4)派生类析构函数怎么写?☆☆
六、什么是友元?友元关系能继承吗?
七、静态成员和继承的关系?
八、什么是多继承,多继承的坑是什么?
九、如何解决菱形继承的问题?
十、菱形虚拟继承的原理是什么?
一、什么是继承?怎么定义继承?
当多个类之间有许多共同的方法或属性时,可以将这些方法和属性提取出来作为一个父类,让子类通过继承父类来进行代码的复用,同时,子类也可以在父类的基础上做一些扩展。
怎么定义:
class 派生类名:继承方式(public/protected/private) 基类名 { public:int _n; };//eg: class Student:public Person{ public:int _stuid; };
二、继承关系和访问限定符?
1)首先对于基类的私有成员,无论以什么方式继承,在类外以及派生类内都是不可见的。
2)对于基类的公有成员和保护成员:
公有继承:基类所有成员保持原有访问权限。
保护继承:基类的公有成员访问权限变成保护。
私有继承:基类的公有成员和保护成员访问权限变成私有。
三、基类和派生类对象可以赋值转换吗?
1)向上转换:派生类对象/指针可以赋值给基类的对象/指针/引用,这种情况也叫切片(只看到基类中的部分)。
!!注意:只有公有继承才有可能直接进行基类和派生类之间的赋值转换,私有和保护继承改变了派生类对基类的访问权限,使得无法直接进行类型转换。
2)向下转换:基类对象不能赋值给派生类对象。基类指针类型或基类引用类型如果原本是指向派生类的,那么它可以赋值给派生类指针类型或派生类引用类型,但需要手动强制类型转换。
class Base {
private:int private1;
};class Pai1 : public Base{
private:int p1;
};int main()
{Pai1 p;Base b;b = p;Base& rb = p;Base* pb = &p;Pai1* pp = (Pai1*)pb;Pai1& rp = (Pai1&)rb;
}
四、什么是隐藏?隐藏vs重载?
在继承体系中基类和派生类的作用域是独立的,如果在基类和派生类中出现了同名成员,子类将屏蔽父类同名成员,直接访问自己的,这就叫隐藏。如果是成员函数,只要函数名相同,就构成隐藏(也叫重定义)。
如果子类想要访问父类的同名成员,可以指定类域。
class A { public:void fun(){std::cout << "A" << std::endl;} }; class B : public A{void fun(){A::fun();std::cout << "B" << std::endl;} };
隐藏和重载的区别在于:隐藏是在不同的作用域的,重载是在同一作用域下的。且重载的限制条件更多,不仅要求函数同名,且形参列表必须不同。
五、派生类的默认成员函数?
1)派生类构造函数怎么写?
派生类必须调用父类构造函数来初始化父类成员。
1)父类有默认构造,派生类构造时会自动调用父类默认构造。
2)父类没有默认构造,需要在派生类构造函数的初始列表显示调用父类构造函数。
class Person { public:Person(string name):_name(name){} private:string _name; }; class Student :public Person{ public:Student(string name,int num):Person(name),_num(num){} private:int _num; };
2)派生类拷贝构造函数怎么写?
调用父类的拷贝构造,可以传子类的对象给父类拷贝构造,构成切片。然后再实现自己的部分。
不显示写的话会调父类的默认构造而不是拷贝构造,所以不能不显示调用。
Student(const Student& stu):Person(stu),_num(stu._num){}
3)派生类operator=怎么写?
要显示调用父类的operator=,再实现自己的部分。
Student& operator=(const Student& stu){if (this != &stu) {Person::operator=(stu);//调用父类的_num = stu._num;}return *this;}
4)派生类析构函数怎么写?☆☆
派生类的析构函数不需要我们手动调用,因为它要保证先析构子类,再析构父类。以防出现析构完父类后,子类又用到父类成员的情况。让编译器来做这件事比让人来做更靠谱。
六、什么是友元?友元关系能继承吗?
如果一个函数或一个类想访问某一个类A的保护成员或私有成员,可以在类A中声明一下:
注意:友元关系不能继承!!!
七、静态成员和继承的关系?
静态成员不属于某个类或对象,它是在静态区中保存的,只有一份,但它是受类的访问限定符的约束的。子类继承的是静态成员的使用权。
静态成员变量必须在类内声明,类外定义和初始化
静态成员函数的定义和初始化可以在类内也可以在类外。
class MyClass { public:static int staticVar; // 在类内声明静态成员变量static void staticFunc() {// 在类内定义静态成员函数,可以直接实现功能} };int MyClass::staticVar = 0; // 在类外定义静态成员变量并进行初始化
八、什么是多继承,多继承的坑是什么?
一个人是可能有多重角色的,那么有多个父类也是合理的。
但是,有了多继承,就有可能出现菱形继承,菱形继承会引发很多问题:
① 二义性(Assistant对象中访问的_name到底访问的是从哪个类中继承的?)
② 数据冗余(浪费空间)
九、如何解决菱形继承的问题?
1)二义性:可以通过指定类域来访问,这种方式虽然表面上解决了二义性的问题,但它其实是违背了现实世界的。
2)更根本地解决数据冗余和二义性的做法是:虚继承
给菱形继承中继承了同一个类的类都加上virtual关键字。
class Student:virtual public Person {//... } class Teacher:virtual public Person {//... }
十、菱形虚拟继承的原理是什么?
继承了同一个类的这些类加了virtual关键字后,这些类会多一个成员,这个成员的类型是虚基表的指针,指向的是一张虚基表,虚基表里保存是距离父类的成员的偏移量。
思考一下:D对象赋值给B对象的切片,B*pb = &d; pb->_a可以正常访问吗?
为什么不直接存偏移量?
虚基表除了存偏移量可能还会存别的值,在对象中存虚基表的指针可以保证每个对象只需要多存一个指针大小即可。

在下面的例子中,A的构造会调用几次?ABCD谁先构造?
十一、继承和组合的区别?什么时候用继承,什么时候用组合?
组合是指一个类持有另一个类的实例作为自己的属性,通过调用被组合对象的方法实现功能。组合是一种"has a"关系,即一个对象包含另一个对象。
在选择使用继承还是组合时,通常遵循以下原则:
- 当两个类之间有明显的"is a"关系,即子类是父类的一种特殊形式时,可以使用继承。
- 当两个类之间有“has a”关系,即一个类包含另一个类作为属性时,可以使用组合。
继承时一种白箱复用,其内部的细节对子类是可见的,组合是一种黑箱复用,对象内部细节是不可见的。尽量避免过度使用继承,因为过度继承可能导致类之间的耦合度过高,影响代码的灵活性和可维护性。因此在设计时需要根据具体的情况选择合适的方式来设计类之间的关系。
相关文章:
继承【C/C++复习版】
目录 一、什么是继承?怎么定义继承? 二、继承关系和访问限定符? 三、基类和派生类对象可以赋值转换吗? 四、什么是隐藏?隐藏vs重载? 五、派生类的默认成员函数? 1)派生类构造函…...
题目 2694: 蓝桥杯2022年第十三届决赛真题-最大数字【暴力解法】
最大数字 原题链接 🥰提交结果 思路 对于每一位,我我们都要尽力到达 9 所以我们去遍历每一位, 如果是 9 直接跳过这一位 如果可以上调到 9 我们将这一位上调到 9 ,并且在a 中减去对应的次数 同样的,如果可以下调到 9,我…...
【C语言】- C语言字符串函数详解
C语言字符串函数详解 1、void *memset(void *dest, int c, size_t count); 将dest前面count个字符置为字符c. 返回dest的值. 2、void *memmove(void *dest, const void *src, size_t count); 从src复制count字节的字符到dest. 如果src和dest出现重叠, 函数会自动处理. 返回…...
如何实现小程序滑动删除组件+全选批量删除组件
如何实现小程序滑动删除组件全选批量删除组件 一、简介 如何实现小程序滑动删除组件全选批量删除组件 采用 uni-app 实现,可以适用微信小程序、其他各种小程序以及 APP、Web等多个平台 具体实现步骤如下: 下载开发者工具 HbuilderX进入 【Dcloud 插…...
基于SSM+Jsp+Mysql的农产品供销服务系统
开发语言:Java框架:ssm技术:JSPJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包…...
网络编程学习探索系列之——广播原理剖析
hello !大家好呀! 欢迎大家来到我的网络编程系列之广播原理剖析,在这篇文章中, 你将会学习到如何在网络编程中利用广播来与局域网内加入某个特定广播组的主机! 希望这篇文章能对你有所帮助,大家要是觉得我写…...
小程序开发SSL证书下载和安装
在开发小程序时,确保数据的安全传输至关重要,而实现这一目标的关键在于正确获取与安装SSL证书。以下详细介绍了从获取到安装SSL证书的完整流程,以助您为小程序构建可靠的加密通信环境。 一、小程序SSL证书类型选择: 域名验证型D…...
医疗图像分割 | 基于Pyramid-Vision-Transformer算法实现医疗息肉分割
项目应用场景 面向医疗图像息肉分割场景,项目采用 Pytorch Pyramid-Vision-Transformer 深度学习算法来实现。 项目效果 项目细节 > 具体参见项目 README.md (1) 模型架构 (2) 项目依赖,包括 python 3.8、pytorch 1.7.1、torchvision 0.8.2(3) 下载…...
蓝桥杯 每日2题 day5
碎碎念:哦哈呦,到第二天也是哦哈哟,,学前缀和差分学了半天!day6堂堂连载! 0.单词分析 14.单词分析 - 蓝桥云课 (lanqiao.cn) 关于这题就差在input前加一个sorted,记录一下下。接下来就是用字…...
[ 云计算 | AWS 实践 ] Java 应用中使用 Amazon S3 进行存储桶和对象操作完全指南
本文收录于【#云计算入门与实践 - AWS】专栏中,收录 AWS 入门与实践相关博文。 本文同步于个人公众号:【云计算洞察】 更多关于云计算技术内容敬请关注:CSDN【#云计算入门与实践 - AWS】专栏。 本系列已更新博文: [ 云计算 | …...
循环单链表算法库
学习贺老师数据结构 数据结构之自建算法库——循环单链表_循环单链表 csdn-CSDN博客 整理总结出的循环单链表算法库 v1.0 : 基本实现功能 v2.0(2024.4.6): 修复Delete_SpecificLocate_CyclicList()删除节点函数bug,添加验证删除节点是否超范围判断 目录 1.主要功能…...
WPS二次开发系列:Gradle版本、AGP插件与Java版本的对应关系
背景 最近有体验SDK的同学反馈接入SDK出现报错,最终定位到原因为接入的宿主app项目的gradle版本过低导致,SDK兼容支持了android11的特性,需要对应的gradle插件为支持android11的版本。 现象 解决方案 将gradle版本升级至支持android11的插件版…...
绿联 安装MariaDB数据库用于Seatable服务
绿联 安装MariaDB数据库用于Seatable服务 MariaDB MariaDB 是一个流行的开源关系型数据库管理系统(RDBMS),它是MySQL的一个分支,提供了丰富的功能和性能,适用于各种应用场景。 核心功能 SQL支持: MariaDB完全支持SQL&a…...
Spark, Storm, Flink简介
目录 1.Spark VS Storm2.Storm VS Flink 本文主要介绍Spark, Storm, Flink的区别。 1.Spark VS Storm Spark和Storm都是大数据处理框架,但它们在设计理念和使用场景上有一些区别: 实时性:Storm是一个实时计算框架,适合需要实时…...
【攻防世界】mfw(.git文件泄露)
首先进入题目环境,检查页面、页面源代码、以及URL: 发现页面无异常。 使用 dirsearch 扫描网站,检查是否存在可访问的文件或者文件泄露: 发现 可访问界面/templates/ 以及 .git文件泄露,故使用 GItHack 来查看泄露的 …...
递归神经网络(Recursive Neural Networks)
递归神经网络(Recursive Neural Networks)是一种特殊的神经网络,它们通过处理具有树形结构的数据来捕获数据的深层次关系,尤其是在自然语言处理和计算机视觉中的一些应用,如语法分析和场景理解。 1. 理解基本概念和背…...
【leetcode面试经典150题】29.三数之和(C++)
【leetcode面试经典150题】专栏系列将为准备暑期实习生以及秋招的同学们提高在面试时的经典面试算法题的思路和想法。本专栏将以一题多解和精简算法思路为主,题解使用C语言。(若有使用其他语言的同学也可了解题解思路,本质上语法内容一致&…...
ThinkPHP审计(1) 不安全的SQL注入PHP反序列化链子phar利用简单的CMS审计实例
ThinkPHP代码审计(1) 不安全的SQL注入&PHP反序列化链子phar利用&简单的CMS审计实例 文章目录 ThinkPHP代码审计(1) 不安全的SQL注入&PHP反序列化链子phar利用&简单的CMS审计实例一.Thinkphp5不安全的SQL写法二.Thinkphp3 SQL注入三.Thinkphp链5.1.x结合phar实现…...
Centos中一些有趣的命令
目录 1.sl 小火车 2. cowsay 会说话的牛 3.toilet/figlet 图形化输出 4.aafire 小火焰 5.linux_logo 显示系统logo 1.sl 小火车 yum install sl 2. cowsay 会说话的牛 yum install cowsay 3.toilet/figlet 图形化输出 yum install toilet yum install figlet 4.aafire 小火…...
elementUI2
ElementUI 图片引用查询表单表格展示新增修改详情图表 图片引用 <img :src"logo" width"100%" height"100%"/>import logoImg from /assets/logo/home.pngdata() {return {logo: logoImg,}}查询表单 <el-form :model"queryParams…...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...
C++_核心编程_多态案例二-制作饮品
#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...
线程同步:确保多线程程序的安全与高效!
全文目录: 开篇语前序前言第一部分:线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分:synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分ÿ…...
Python实现prophet 理论及参数优化
文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...
相机从app启动流程
一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...
uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...
Redis数据倾斜问题解决
Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中,部分节点存储的数据量或访问量远高于其他节点,导致这些节点负载过高,影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...


注意:友元关系不能继承!!!

