8.类的继承

2023-05-16

目录

  • 1.继承的定义
  • 2.继承的作用
  • 3. 继承的语法
  • 4. 类继承成员属性的访问权限
  • 5. 利用参数列表,初始化父类的私有成员
  • 6. 继承中的构造函数与析构函数
  • 7. 总结共继承的权限问题
  • 8.类中的隐藏问题
  • 9. 类中的多继承
  • 10.类中多级继承
  • 11. 菱形继承(引入:虚继承)

1.继承的定义

从父类中获取一些功能接口或 数据成员,如果该成员是共有或保护成员则子类可以直接访问,提高代码的复用性。
在这里插入图片描述

2.继承的作用

  1. 提高代码的复用性
  2. 有利于软件版本的升级

3. 继承的语法

class  类名: 继承方式  基类名(父类名)
{
    //填写派生类的成员 (子类的成员) 
}

//定义一个 person基类 
class  person
{  
	 private: 
		 char  name[1024]; 
		 int  age;  
		 int  height;
}; 

//通过基类派生出一个警察类 
class JC:public person
{
  
    //新增警察的信息 
	private: 
	    int  power; //警察力量 
	    int  level; //级别
};
//当前这个警察就拥有所有 人的基本 信息 和自己的新增信息了 

4. 类继承成员属性的访问权限

在这里插入图片描述

class  base
{
	public:
		int a; 
		void set_base(int a,int b,int c) //没有问题,内部可以访问一切成员
		{
		    this->a = a;
		    this->b = b;
		    this->c = c;
		}
	protected:
		int b;
	private:
		int c;
};


class  new_base :public base
{
	public: 
		void  set_new_base(int a,int b,int c)
		{
		     this->a = a;
		     this->b = b;
		   //  this->c = c;  错误的,私有成员只能内部访问 
		}
};

void set_base(int a,int b,int c)
{
       base  tmp; 
       tmp.a = a;
     //  tmp.b = b;  错误的,保护成员只能 子类 或 自身访问 
     //  tmp.c = c;  错误的, 私有成员只能 自己访问。 
}
 总结:
 	1.假设想要在派生类中,直接访问基类的数据成员,那么基类的数据成员只能 设置为共有权限  或 保护权限。 
 	2.假设想要在派生类中,访问基类的私有成员,只能在基类中设计接口,让派生类间接访问。

在这里插入图片描述

5. 利用参数列表,初始化父类的私有成员

在这里插入图片描述

6. 继承中的构造函数与析构函数

  1. 基类和派生类的构造函数都会执行:
    构造函数的执行顺序: 先调用基类的构造函数,再调用派生类的构造函数
  2. 基类和派生类的析构函数都会执行:
    析构函数的执行顺序: 先调派生类的析构函数,再调用基类的析构函数
    总结: 在类的继承中,一定要处理好这些 基类 与派生类的构造函数 与析构函数。让派生类可以调用到 自己的构造 与 基类的构造。否则无法创建对象!

7. 总结共继承的权限问题

在这里插入图片描述

8.类中的隐藏问题

  1. 在继承中,如果子类与父类出现同名函数,则子类会把父类的功能函数给隐藏掉。假设想要在子类中使用父类被隐藏掉的接口, 是用 域操作符 指定是用父类接口 。
  2. 派生类中,只要编写了一个与父类同名的函数就会把父类的方法给隐藏了,不支持 重载
  3. 通过父类引用 派生类 也可以调用父类的方法。 base &=new_base (通过父类引用子类)
    class  base
    {
     	public: 
       	void show()
       	{
             cout <<  "show base" << endl; 
       	}
    };
    //基类 和 派生类出现了同名函数成员。
    class  new_base :public base
    {
     	public:  
      	void  show(int a,int b)  //对父类的show 方法进行重载 
      	{    
             cout << a << endl; 
             cout << b << endl; 
      	}
    };
    int main()
    {
         new_base  a; 
         a.show(); //调用父类的 show 方法 ,无效的调用。因为父类的方法已经被隐藏了
         a.show(10,20); //调用自己的 show 方法 
         //利用域操作符 ,声明是用父类的方法  
         a.base::show(); 
    
    }
    

9. 类中的多继承

  1. 一个派生类可以继承多个基类, 获取多个基类的功能接口和数据成员,提高代码的复用性。
  2. 语法:
    class 派生类 :继承方式 基类 ,继承方式 基类2  ........
    {
        
    }
    例子: 
    class base : public  base1 ,public  base2 
     			
     构造函数的执行顺序: base1 -> base2 -> base 
     析构函数的执行顺序:  base -> base2 -> base1 
        
    //提示: 哪一个先继承,那么就先执行他的构造 ,从左 -》 右
    
  3. 多继承的参数列表初始化:
    class base_a
    {
    	public:
    		base_a(int a):a(a){}
    		int a;
    };
    
    class base_b
    {
    	public:
    		base_b(int b):b(b){}
    		int b;
    };
    
    class base_all:public base_a ,public  base_b
    {
    	public:
       		base_all(int a,int b,int c):base_a(a),base_b(b),c(c){}
    		int c;
    
    	  	void show()
    	  	{
    	      	cout << a << endl;
    	      	cout << b << endl; 
    	      	cout << c << endl;
    	  	}
    };
    

10.类中多级继承

  1. 语法:
    class 基类名  
    class 派生类 :继承方式 基类名 
    class 派派生类 : 继承方式  派生类 
    
    例子: 
    class  base 
    class  base_a :public base 
    class  base_b :public base_a
    
    构造函数的执行顺序:  base  -> base_a  ->  base_b 
    析构函数的执行顺序:  base_b -> base_a ->   base  
    
    在这里插入图片描述
  2. 多级继承的参数列表初始化:
    在这里插入图片描述

11. 菱形继承(引入:虚继承)

在这里插入图片描述
菱形继承会出现一个二义性问题,导致派生类无法调用,基类的所有功能函数!!
菱形继承的二义性解决方式:(最强方式 : 虚继承)

1.利用 域操作符,指定使用哪一个基类中的函数方法 
      a.base_a::show(); 
      a.base_b::show(); 
2.利用 基类引用派生类,再调用出现二义性的方法  
       base_a &q=a; 
	   base_b &q=a; 

3.在派生类中重写出现二义性的方法,把之前的隐藏掉。  
    
4.最强的处理方法: 利用虚继承,让base 的空间存放在虚表中,不构造两次!! 
base: 
base_a :virtual  public  base     //-> base_a 虚继承base -》 系统就会把 base 放到虚表中
base_b :virtual  public  base    //->base_b 虚继承base -> base_b 发现虚表已经存在base了就直接使用不再分配。 

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

8.类的继承 的相关文章

随机推荐

  • aruco二维码

    1 二维码的生成 简单方式 xff1a 直接在下面的网站上选择 xff0c 操作简单https chev me arucogen 网站界面如下 xff1a
  • STM8S 功耗总结

    http blog sina com cn s blog 542bad910101ral2 html STM8S103 STM8S003 PA1脚虽可以用外部中断唤醒CPU xff0c 但功耗过大 xff0c 有300uA电流 xff0c
  • ESP32四轴飞控硬件设计

    一 前言 目前许多入门级开源飞控都是基于STM32系列的 xff0c 基于此系列的有非常严重的短板 xff0c 例如说通信方面 xff0c 需要外置通信模块 ESP32本身带有WIFI和蓝牙 xff0c 在通信方面有着一定的优势 xff0c
  • C++弹窗拦截程序,弹窗广告怎么关闭?不用问,我教你怎么屏蔽!

    现在大家使用电脑的频率越来越高 xff0c 上课写作业 上班做工作 娱乐生活 在家购物等 xff0c 我们使用电脑的时间越来越长 相信很多人都和小编一样 xff0c 经常遇到电脑的右下角出现出现弹窗广告的问题 要去叉掉就很麻烦 而且有时候想
  • VNC远程桌面使用方法

    参考 xff1a https blog csdn net weixin 41803874 article details 81233789 一共两台电脑 xff0c 分别为服务端和客户端 xff0c 为与场景联系方便 xff0c 我们将需要
  • 激光雷达闭环检测/地点识别算法OverlapTransformer/SeqOT(2022)

    最新激光雷达闭环检测 地点识别算法 OverlapTransformer已经完整开源 xff0c 相关论文已经被RAL IROS 2022收录 https github com haomo ai OverlapTransformer Ove
  • 我的创作纪念日

    初心未改 xff0c 继续向前
  • 最新激光雷达闭环检测/地点识别算法CVTNet(2023)

    CVTNet以激光点云多类投影生成的二维图为输入 xff0c 利用cross transformer将多类信息交叉融合 xff0c 为激光点云提取强特异性描述子 xff0c 实现SLAM闭环检测或全局定位功能 此外 xff0c CVTNet
  • python使用ffmpeg推流出现OSError: [Errno 2] No such file or directory

    python使用ffmpeg推流出现OSError Errno 2 No such file or directory 具体错误如下 xff1a Traceback span class token punctuation span mos
  • GDB调式工具学习笔记---单步执行和跟踪函数调用

    GDB调式工具学习笔记 单步执行和跟踪函数调用 简介1 单步执行和跟踪函数调用1 1 示例程序1 2 常用命令1 2 1 help1 2 2 list l 1 2 3 quit1 2 4 start1 2 5 next xff08 n xf
  • GDB调式工具学习笔记---断点

    GDB调式工具学习笔记 断点 2 断点2 1 示例代码2 2 常用命令2 2 1 display和undisplay2 2 2 break b 2 2 3 continue xff08 c xff09 2 2 4 disable2 2 6
  • C语言网络编程——UDP

    C语言网络编程 UDP 2 1 基于UDP的网络编程2 2 1 服务端实现2 2 2 客户端实现 2 1 基于UDP的网络编程 2 2 1 服务端实现 使用socket函数 xff0c 创建一个socket使用bind 函数 xff0c 绑
  • STM8S电源管理-重点活跃停机模式

    http blog sina com cn s blog 542bad910101qkru html
  • 多态的定义

    多态是什么 xff1f 多态 polymorphism 是面向对象编程 OOP object oriented programming 的一个重要特征 xff0c 顾名思义为多种形态 xff0c 详细解释为一个接口 xff0c 多种实现 x
  • 虚函数实现多态的原理

    1 C 43 43 中如何实现多态 基类中先声明一个虚函数至少有一个继承该基类的子类 2 虚函数实现多态的原理 当一个类中出现虚函数或着子类继承了虚函数时 xff0c 就会在该类中产生一个虚函数表 xff08 virtual table x
  • 停车场车牌识别项目

    停车场车牌识别项目 简介开发环境技术栈1 Sqlite2 TTS3 摄像头使用教程 实现效果图源码 简介 该项目的应用场景为停车场 xff0c 记录车辆的进出时间 xff0c 对车辆进行收费 开发环境 Windows 下的 QT 技术栈 Q
  • STM32串口输出字符串

    目录 串口步骤1 确定 IO 口并初始化2 初始化 UATR3 UART 中断配置4 编写 UART 中断服务函数5 1 方法一 xff1a 重定向 fputc 5 2 方法二 xff1a 将字符串分割成一个一个字符发送出去 效果附源码 串
  • 常用Linux命令

    目录 Shell常用Shell命令1 目录操作类2 文本操作类3 用户管理4 文件权限类5 磁盘管理类6 网络操作类7 控制终端类8 开关机类 Shell小技巧 Shell shell是一个应用程序 xff0c 作为用户与内核信息传递的桥梁
  • VSCode与Keil联合开发STM32

    目录 1 为什么要联合开发2 配置VSCode的环境1 安装c c 43 43 2 安装Embedded IDE3 设置编译工具4 导入 STM32 工程5 配置编译器选项6 烧录工具选择 3 附 1 为什么要联合开发 Keil容易出现中文
  • 8.类的继承

    目录 1 继承的定义2 继承的作用3 继承的语法4 类继承成员属性的访问权限5 利用参数列表 xff0c 初始化父类的私有成员6 继承中的构造函数与析构函数7 总结共继承的权限问题8 类中的隐藏问题9 类中的多继承10 类中多级继承11 菱