关于继承~

继承

动物有猫、狗,   猫又分为加菲猫、布偶猫......;狗又有哈士奇、德国牧羊犬......

我们发现,下一类除了拥有上一类的共性之外,还拥有自己的特性。

于是我们可以利用继承的方式来减少重复的代码

继承的基本语法

class A:public B

A称为子类 或 派生类

B称为父类 或 基类

子类中的成员主要分为两大类

一类是从父类中继承过来的,我们叫做共性

一类是子类自己定义的,我们叫特性

继承的好处:减少重复的代码

//继承的基本语法
class BasePage {
public:void header() {cout << "首页、公开课、登录、注册...(公共头部)" << endl;}void footer() {cout << "帮助中心、联系方式、站内地图...(公共底部)" << endl;}void left() {cout << "Java、Python、C++...(公共列表)" << endl;}
};class Java :public BasePage
{
public:void content() {cout << "Java学科视频" << endl;}
};
class Python :public BasePage
{
public:void content() {cout << "Python学科视频" << endl;}
};
class CPP :public BasePage
{
public:void content() {cout << "CPP学科视频" << endl;}
};
void test01() {Java ja;ja.header();ja.footer();ja.left();ja.content();cout << "------------" << endl;Python py;py.header();py.footer();py.left();py.content();cout << "------------" << endl;CPP cpp;cpp.header();cpp.footer();cpp.left();cpp.content();cout << "------------" << endl;
}
int main()
{test01();
}

继承方式

继承语法:class 子类:继承方式 父类

继承方式分为三种:公共继承、保护继承、私有继承

公共继承:公共成员、保护成员位置不变,私有成员不可访问

保护继承:公共成员、保护成员位于保护位置,私有成员不可访问

私有继承:公共成员、保护成员、私有成员都不可访问

注意:虽然不可访问,但是子类中确实继承了这些成员,只是被隐藏了,子类的子类也会继承这些属性。

继承中的对象模型

先敲一段代码

//继承中的对象模型
class Base {
public:int m_a;
protected:int m_b;
private:int m_c;
};
class Son :public Base {
public:int m_d;
};
int main()
{Son s1;cout << "size of Son=" << sizeof(s1);
}

利用sizeof计算类的长度,可以验证上一点讲的私有成员或私有继承不可访问但确实存在于子类中

下面再利用开发人员命令提示符用模型观察 

 

继承中构造和析构顺序

利用上面的模型也可以说明继承中 父类先构造、子类后构造(先有父亲再有儿子)

然后依据先进后出的原理,子类先析构、父类后析构

继承同名成员处理方式

//继承同名成员(非静态)的调用方式
class Base {
public:int m_a = 10;void fun() {cout << "父类的func" << endl;}void fun(int a) {cout << "父类的func 含参" << endl;}
};
class Son :public Base {
public:int m_a = 100;void fun() {cout << "子类的func" << endl;}
};
void test01() {Son s1;cout << s1.m_a << endl;//子类对象直接调用的是子类成员cout << s1.Base::m_a << endl;//子类对象加上父类作用域运算符调用的是父类成员s1.fun();s1.Base::fun();//s1.fun(100);报错,因为子类、父类函数同名情况下,子类会隐藏父类的所有同名成员函数,//要访问则加上作用域运算符s1.Base::fun(1000);
}
int main()
{test01();
}

总结:1、子类对象直接访问的是子类同名成员

           2、子类对象加上作用域可以访问父类同名成员

           3、子类和父类成员函数同名情况下,子类会隐藏父类中同名函数,子类对象加上作用域运算符可以访问父类同名函数 

继承同名静态成员处理方式

//继承中同名的静态成员
class Base {
public:void func() {cout << "diao1" << endl;}static  int a;
};
int Base::a = 8;//要加上作用域
class Son :public Base {
public:void func() {cout << "diao2" << endl;}static int a;
};
int Son::a = 9;
int main()
{Son s1;s1.func();s1.Base::func();cout << s1.a << endl;cout << s1.Base::a << endl;cout << Son::a << endl;cout << Son::Base::a << endl;//总结:对于类的非静态成员 通过对象访问//对于静态成员 1.通过对象访问//		  2.通过类名访问
}

多继承语法

class Base1 {
public:Base1(){m_A = 10;}int m_A;
};
class Base2 {
public:Base2() {m_A = 100;}int m_A;
};
class Son :public Base1, public Base2 //实际开发不建议使用多继承,多个程序员设置相同成员,影响使用
{};
void test01() {Son s1;//s1.m_A;父类成员同名,加作用域以区分cout << "Base1中m_A=" << s1.Base1::m_A << endl;cout << "Base2中m_A=" << s1.Base2::m_A << endl;
}
int main()
{test01();
}

菱形继承

//菱形继承
class Animal { public:int m_Age; };
class Sheep :virtual public Animal {};//继承前加virtual关键字,变为虚继承,继承的父类被称为虚基类
class Tuo:virtual public Animal {};//实际上是改为传递两个指针,指针都指向m_Age
class SheepTuo: public Sheep, public Tuo{};
void test01() {SheepTuo yt;yt.Sheep::m_Age = 19;yt.Tuo::m_Age = 29;yt.m_Age = 39;//若没有virtual,则此操作报错cout << "yt.Sheep::m_Age =" << yt.Sheep::m_Age << endl;cout << "yt.Tuo::m_Age =" << yt.Tuo::m_Age << endl;cout << "yt.m_Age =" << yt.m_Age << endl;
}
int main()
{test01();
}

菱形继承为子类继承父类中两份相同的数据,造成资源浪费和无意义

利用虚继承可以解决,虚继承后变为同一份数据 

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

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

相关文章

buuctf re findKey

参考&#xff1a;http://t.csdnimg.cn/hUKRJ 参考&#xff1a;http://t.csdnimg.cn/kIk4i 32位&#xff0c;ida打开 f5&#xff0c;先不管呢 winmain函数 看看字符串 进到flag那里&#xff0c;没法反编译 寻找 看汇编&#xff0c;发现两个一样的push&#xff08;不理解怎…

【力扣】203、环形链表 II

142. 环形链表 II 要解决这道题&#xff0c;首先需要对问题进行拆解&#xff1a; 确定链表是否存在环确定环的入口点 如何判断是否存在环呢&#xff1f;这个比较容易想到&#xff0c;使用快慢指针即可判断链表是否存在环。我们定义两个指针&#xff1a; ListNode slow head…

CUDA和显卡驱动

1.安装显卡驱动 https://www.nvidia.com/download/index.aspx?langen-us 由于我的显卡是RTX4060&#xff0c;因此先选择RTX40系列&#xff0c;然后选择RTX4060&#xff0c;进行安装 2.查看显卡对应的CUDA CUDA安装地址&#xff1a;https://developer.nvidia.com/cuda-toolk…

buuctf-misc-27.面具下的flag

27.面具下的flag 题目&#xff1a;binwalk分离后&#xff0c;解压vmdk文件,对其中的字符进行翻译 将其放到kali中进行binwalk,可以看到有有隐藏的压缩包文件&#xff0c;我们提取一下 文件放到了主目录下&#xff0c;我们使用对应命令发现有zip文件&#xff0c;然后再使用对应…

前端工程化04-VsCode插件设置总结(持续更)

1、输出语句log设置 log输出、平常你输出log,还必须得打一个console然后再.log()非常不方便&#xff0c;当然我们可以直接输入一个log,但是提示有两个&#xff0c;我们还得上下选择 所以我们直接采用插件的提示 一个clg就可以了 2、括号包裹提示 找到VsCode的settings.js文…

【JavaEE】多线程安全问题

文章目录 1、什么是多线程安全问题2、出现线程不安全的原因2.1 线程在系统中是随机调度&#xff0c;抢占式执行的2.2 多个线程同时修改同一个变量2.3 线程针对变量的修改操作&#xff0c;不是“原子”的2.4 内存可见性问题2.5 指令重排序 3 、如何解决线程安全问题3.1 锁操作3.…

《十三》QT绘图原理双缓冲机制

一、原理与设计 所谓双缓冲机制&#xff0c;是指在绘制控件时&#xff0c;首先将要绘制的内容绘制在一个图片中&#xff0c;再将图片一次性地绘制到控件上。在早期的 Qt 版本中&#xff0c;若直接在控件上进行绘制工作&#xff0c;则在控件重绘时会产生闪烁地现象&#xff0c;控…

C语言之数据结构之栈和队列的运用

目录 1. 用队列实现栈1.1 思路讲解1.2 代码实现 2. 用栈实现队列1.1 思路讲解1.2 代码实现 总结 •͈ᴗ•͈ 个人主页&#xff1a;御翮 •͈ᴗ•͈ 个人专栏&#xff1a;C语言数据结构 •͈ᴗ•͈ 欢迎大家关注和订阅!!! 1. 用队列实现栈 题目描述&#xff1a; 请你仅使用两个…

练习题(2024/5/3)

1对称二叉树 给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 示例 1&#xff1a; 输入&#xff1a;root [1,2,2,3,4,4,3] 输出&#xff1a;true示例 2&#xff1a; 输入&#xff1a;root [1,2,2,null,3,null,3] 输出&#xff1a;false提示&#xff1a; 树中…

鸿蒙通用组件Image简介

鸿蒙通用组件Image简介 图片----Image图片支持三种引用方式设置图片宽高设置图片缩放模式设置图片占位图设置图片重复样式设置图片插值效果 图片----Image Image主要用于在应用中展示图片 Image($r(app.media.app_icon)).width(150) // 设置宽.height(150) // 设置高.objectF…

一文看懂卷积神经网络CNN(1)—前馈神经网络

目录 参考资料 一、神经网络 1、人脑神经网络 2、人工神经网络 3、神经网络的发展历史 二、前馈神经网络 1、神经元 &#xff08;1&#xff09;Sigmoid型函数 ① Logistic函数 ②Tanh函数 ③两个函数形状对比 &#xff08;2&#xff09;ReLU函数 ① 带泄露的ReLU函…

leetcode刷题(3): 动态规划

文章目录 42. 接雨水解题思路c 实现 64. 最小路径和解题思路c 实现 62 不同路径解题思路c 实现 42. 接雨水 题目&#xff1a; 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例: 解题思路 使用动态…

大功率双向直流电源的输出电压和电流

双向直流电源&#xff08;Bidirectional DC Power Supply&#xff09;是一种具有双向输出电能的直流电源。与传统的直流电源相比&#xff0c;双向直流电源在输出电能的同时&#xff0c;还具备一定的电流输入能力&#xff0c;从而使其应用范围更加广泛。大功率双向直流电源作为电…

言语 目录

List item List item List item

【业务场景】京东实际场景,频繁GC引起的CPU飙高问题的解决

目录 1.业务介绍 2.判断任务类型 3.CPU飙高的原因 1.业务介绍 本文的业务场景是京东零售线公开的一篇文章&#xff0c;文章内容详细介绍了京东零售线如何将广告相关的定时任务从半小时优化到秒级的&#xff0c;原文链接&#xff1a; 半小时到秒级&#xff0c;京东零售定时…

USP技术提升大语言模型的零样本学习能力

大语言模型&#xff08;LLMs&#xff09;在零样本和少样本学习能力上取得了显著进展&#xff0c;这通常通过上下文学习&#xff08;in-context learning, ICL&#xff09;和提示&#xff08;prompting&#xff09;来实现。然而&#xff0c;零样本性能通常较弱&#xff0c;因为缺…

数据库(MySQL)—— 事务

数据库&#xff08;MySQL&#xff09;—— 事务 什么是事务事务操作未控制事务测试异常情况 控制事务一查看/设置事务提交方式&#xff1a;提交事务回滚事务 控制事务二开启事务提交事务回滚事务 并发事务问题脏读&#xff08;Dirty Read&#xff09;不可重复读&#xff08;Non…

【热门话题】如何构建具有高度扩展性的系统

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 如何构建具有高度扩展性的系统引言一、理解扩展性1.1 扩展性的定义1.2 扩展性的…

嵌入式单片机中必会的50个电路分享

单片机 电源 声音模块 收音机 485

微软如何打造数字零售力航母系列科普08 - Yobe 如何联手微软Azure,安全使用客户数据,预测客户购买行为?

Yobe 如何联手Azure&#xff0c;安全使用客户数据&#xff0c;预测客户购买行为&#xff1f; 在当今数据驱动的世界中&#xff0c;了解客户行为并有能力通过数据和分析预测客户意图是企业保持竞争力所应具备的首要优势。Yobi由Max Snow、Bill Wise和Tom Griffiths于2019年创立&…