派生类的定义

2023-10-31

类的继承与派生

基类与派生类

继承(inheritance)是面对对象程序设计的一个重要特性,是软件复用(software reuse)的一个重要形式。

继承允许在原有类的基础上创建新的类,新类可以从一个或多个原有类中继承数据成员和成员函数,并且可以重新定义或增加新的成员,从而形成类的层次。继承具有传递性,不仅支持系统的可重用性,而且还促进系统的可扩充性。

类的对象是各自封闭的,如果没继承性机制,则类对象中数据,函数就会出现大量重复

继承改变了传统程序设计对不再使用的数据类型和函数进行改写甚至重写的方法,克服了程序无法重复使用的缺点。

通过继承,可吸收现有类的数据和函数来创建新类,并增添新的成员增强此类,这样可以节约程序开发的时间。

在C++中,继承就是在一个已存在的类的基础上建立一个新的类。已存在的类称为基类(base class),又称为父类;新建立的类称为派生类(dervied class),又称为子类

一个新类从已有的类那里获得其特性,这种现象称为类的继承

另一方面,从已有的父类产生一个新的子类,称为类的派生。派生类继承了基类的所有数据成员和成员函数,具有基类的特性,派生类还可以对成员作必要的增加或调整,定义自己的新特性。

一个基类可以派生出多个派生类,每一个派生类又可以作为基类再派生出新的派生类,因此基类和派生类是相对而言的。

派生类分为单级派生多级派生

在这里插入图片描述
一个派生类可以只从一个基类派生,称为单一继承(single inheritance),这是最常见的继承形式,如图所示,类B和类C都只从类A派生
在这里插入图片描述
一个派生类有两个及两个以上的基类,称为多重继承(multiple inheritance),如图所示,类C从类A和类B派生。
在这里插入图片描述
基类与派生类之间的关系为:

(1)基类是对派生类的抽象,派生类是对基类的具体化。基类抽取了它与派生类的公共特征,而派生类通过增加信息将抽象的基类变为某种具体的类型。

(2)派生类是基类的组合,可以把多重继承看作是多个单一继承的简单组合。

派生类的定义

定义派生类的一般形式为:

class 派生类名 : 类派生列表 { //类体
	成员列表
};

除了增加类派生列表外,派生类的定义与类定义并无区别。

类派生列表(class derivation list)指定了一个或多个基类(base class),具有如下形式:

访问标号 基类名

类派生列表可以指定多个基类,中间用逗号(,)间隔,基类名必须是已定义的类名字。

访问标号表示继承方式,可以是public(公有继承),protected(保护继承)或private(私有继承),继承方式决定了对继承成员的访问权限。如果未给出访问标号则默认为private(私有继承)。

派生类的成员列表描述的是派生类自己新增加的数据成员和成员函数。

派生类举例:

#include<iostream>
using namespace std;

class Base { //基类
	private:
		int b_number;
	public:
		Base() { } //基类不带参数的构造函数
		Base(int i) : b_number(i) { } //基类带参数的构造函数
		int get_number() { return b_number; }
		void print() { cout<<b_number<<endl; }
};

class Derived : public Base { //派生类
	private:
		int d_number; //派生类增加的数据成员
	public:
		Derived(int i,int j) : Base(i),d_number(j) { } //派生类构造函数
		void print() { //派生类增加的成员函数
			cout<<get_number()<<" "; //派生类继承的成员函数
			cout<<d_number<<endl;
		}
};

int main()
{
	Base a(2);
	Derived b(3,4);
	cout<<"a is ";
	a.print(); //基类的print
	cout<<"b is ";
	b.print(); //派生类的print
	cout<<"base part of b is ";
	b.Base::print(); //基类的print
	return 0;
}

派生类的构成

派生类的说明:

(1)用作基类的类必须是已定义的,其原因是显而易见的:每个派生类包含并且可以访问其基类的成员,为了使用这些成员,派生类必须知道它们是什么。这一规则说明不可能从类自身派生出一个类

(2)如果需要声明(但并不实现)一个派生类,则只需要声明类名即可。

(3)显然,在一个派生类中,其成员由两部分构成:一部分是从基类继承得到的,另一部分是自己定义的新成员,所有这些成员仍然分为public(公有),private(私有)和protected(保护)三种访问属性。

(4)友元关系不能继承。一方面,基类的友元对派生类的成员没有特殊访问权限。另一方面,如果基类被授予友元关系,则只有基类具有特殊访问权限,该基类的派生类不能访问授予友元关系的类。

(5)如果基类定义了静态成员,则整个继承层次中只有一个这样的成员。无论从基类派生出多少个派生类,每个静态成员只有一个实例

(6)静态成员遵循常规访问控制:如果静态成员在基类中为私有的,则派生类不能访问它。如果该静态成员在基类是公有的,则基类可以访问它,派生类也可以访问它。

(7)一般地,可以使用作用域运算符(::)也可以使用对象成员引用运算符(.)或指针成员引用运算符(->)访问静态成员。

在这里插入图片描述
在实际的编程中,设计一个派生类包括4个方面的工作:
(1)从基类接收成员
除了构造函数和析构函数,派生类会把基类全部的成员继承过来。这种继承是没有选择的,不能选择接收其中一部分成员,而舍弃另一部分成员

(2)调整基类成员的访问
派生类接收基类成员是程序员不能选择的,但是程序员可以对这些成员作出访问策略

(3)修改基类成员
可以在派生类中声明一个与基类成员同名的成员,则派生类中的新成员会覆盖基类的同名成员,就实现了修改基类成员功能的效果

(4)在定义派生类时增加新的成员
一般还应当自己定义派生类的构造函数和析构函数

#include<iostream>
using namespace std;

class Base { //基类
	private:
		int b_number;
	public:
		Base( ){} //基类不带参数的构造函数
		Base(int i) : b_number (i) { } //基类带参数的构造函数
		int get_number( ) {return b_number;}
		void print( ) {cout << b_number << endl;}
};

class Derived : public Base { //派生类
	private:
		int d_number; //派生类增加的数据成员
	public:
		Derived(int i,int j):Base(i),d_number(j){ };
		//派生类构造函数
		void print() { //派生类增加的成员函数
			cout << get_number() << " "; //派生类继承的成员函数
			cout << d_number << endl;
		}
};

int main()
{
	Base a(2);
	Derived b(3,4);
	cout<<"a is ";
	a.print();
	cout<<"b is ";
	b.print();
	return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

派生类的定义 的相关文章

随机推荐

  • vue+高德离线地图vue-amap开发

    前言 在使用多次高德离线地图的插件 vue amap 感觉收获还是很多的 这里来整理下相关资料 效果图 目录 实现步骤 源码在最下面 一 安装插件 二 template配置基础的地图组件 三 data里面定义相关数据 四 撒点的实现 1 t
  • 0.96寸OLED屏硬件驱动电路

    0 96寸OLED屏硬件驱动电路 该电路适合把OLED驱动电路集成到自己的板子上 最终的原理图和PCB已经上传CSDN 可直接点击链接下载 https download csdn net download qq 31785559 59594
  • cocos creator入门教程实现简化版贪吃蛇

    开发工具 Cocos Creator和VS Code 开发语言 TS 简化版贪吃蛇的实现主要涉及的功能就是在吃到场景中随机产生产生的物体后 物体会到蛇头的后面并且跟随移动路径 其原理主要是通过数组来存储相关的坐标数据
  • hive-使用开窗函数实现百分比、topN、前百分比

    有一个订单表A 分别有order id 订单id user id 用户id amt 金额 三个字段 用sql实现以下功能 i 求订单总量为top3的用户及交易笔数 同时求出其交易笔数占全量订单笔数的占比 ii 求每个用户top3交易金额的订
  • SpringAOP JDK动态代理

    1 本篇博客的背景和目的 目前我本人正在学习SpringFramework的知识 这也是这个专栏的主题 我前面的几篇博文中 简单的认识了一下SpringFramework 记录了SpringFramework的环境搭建 记录了SpringI
  • 单片机 指针 的应用

    目录 直接访问物理地址下的数据 1 访问硬件指定内存下的数据 1 如设备ID号 2 将复杂格式的数据转换为字节 方便通信与存储 直接访问物理地址下的数据 1 访问硬件指定内存下的数据 1 如设备ID号 include
  • java 外部调用内部类的方法

    1 使用static可以声明一个内部类 可以直接在外部调用 class Outer 定义外部类 private static String info hello world 定义外部类的私有属性 static class Inner 使用s
  • 关于使用U盘安装ESXi发生的一些错误及解决经验

    烧录工具 rufus ESXi version 6 5U2 安装过程可以参考 https www starwindsoftware com blog create an esxi 6 5 installation usb under two
  • PyCaret入门

    安装 pip install pycaret 查看版本 from pycaret utils import version version 参考文档 GitHub 官网 用户教程 预处理 函数 模型 Notebook教程 函数 Functi
  • 解决VM Workstation安装VMware Tools显示灰色的办法

    其实虚拟机用了好多次了 但是每次使用配置时还是忘这忘那的 这里就简单地再啰嗦下了 解决办法如下 1 关闭虚拟机 2 在虚拟机设置分别设置CD DVD CD DVD2和软盘为自动检测三个步骤 3 再重启虚拟机 灰色字即点亮 如果上述步骤不行
  • 1.spark环境搭建

    Anaconda https www anaconda com products individual d JDK https docs aws amazon com zh cn corretto latest corretto 8 ug
  • OPENGL纹理加载显示颜色偏差

    问题 用Kinect Dk读出来的图像用Opencv显示没有纹理 保存为BMP也没有问题 但是OpenGL纹理加载显示出来偏蓝 解决 OpenGL纹理数据加载时使用的颜色通道错误了 原来数据的颜色通道是BGRA的 之前 glTexImage
  • mysql调优小计

    1 选择最合适的字段属性 类型 度 是否允许NULL等 尽量把字段设为not null 查询时对 是否为null 2 要尽量避免全表扫描 先应考虑在 where 及 order by 涉及的列上建 索引 3 应尽量避免在 where 句中对
  • 使用myheritage实现静态照片变成视频

    网址 https www myheritage com 首先 注册 可以使用google账号 其次 上传照片 接下来 生成动画 最后 下载视频
  • python之post上传文件简单示意

    coding utf 8 作者 萧海 联系 128 File py post py Date 9 1 2023 4 48 PM application
  • java.lang.NoClassDefFoundError: Could not initialize class com解决方案

    本文转载自 https www cnblogs com liuyangfirst p 6811937 html 作者 liuyangfirst 转载请注明该声明 编写的时候遇到这样一个bug java lang NoClassDefFoun
  • 如何使用WINDOWS7本地电脑的远程桌面连接阿里云WINDOWS服务器

    如果您的远程服务器采用了Windows服务器系统 那么使用WINDOWS7的 远程桌面连接 登录云服务器 无论在连接速度上还是方便度上 都会好很多 下面我介绍使用远程桌面连接的方法来管理云服务器 一 工具 原料 阿里云Windows SER
  • 低代码工具该如何选择?

    低代码 概念在国内持续走红 看到很多人都在问市面上这么多的低代码产品 应该如何选择 选择的标准到底是什么 这篇文章就和大家简略的分享一下三个检测 低代码 产品的标准 通过对这三方面的考量 相信大家都能擦亮眼睛找到最好的那一款 1 语言属性
  • 教你搞懂 Git!

    尽管每天你都会用到Git 常用的命令可能不到5个 但你可能现在还搞不懂它的工作原理 为什么Git可以管理版本 基本命令git add和git commit到底在干什么 在这篇文章中 我将用一个例子来解释Git的运行过程 帮助你理解Git的工
  • 派生类的定义

    类的继承与派生 基类与派生类 继承 inheritance 是面对对象程序设计的一个重要特性 是软件复用 software reuse 的一个重要形式 继承允许在原有类的基础上创建新的类 新类可以从一个或多个原有类中继承数据成员和成员函数