【C++类与对象】继承

news2024/11/27 4:34:16

继承

  • 一、继承基本语法
  • 二、继承方式
    • 1、公共继承public
    • 2、保护继承protected
    • 3、私有继承private
  • 三、对象模型
  • 四、继承中的构造与析构顺序
  • 五、同名成员处理方式
    • 同名静态成员处理方法
  • 六、多继承语法(不建议使用)
  • 七、菱形继承(钻石继承)

一、继承基本语法

减少重复代码
语法:class 子类:继承方式 父类
子类也成为派生类,父类成为基类

class Student {
public:
	void Cource() {
		cout << "学生课程" << endl;
	}
	void Source() {
		cout << "学生成绩" << endl;
	}
	void Info() {
		cout << "学生信息" << endl;
	}
};
class Banji :public Student {
public:
	void Peoplenum() {
		cout << "14班级人数" << endl;
	}
};
class Nianji :public Student {
public:
	void Num() {
		cout << "年纪人数" << endl;
	}
};

二、继承方式

在这里插入图片描述
父类:

class S {
public:
	int a;
protected:
	int b;
private:
	int c;
};

1、公共继承public

class A :public S {
public:
	void fun() {
		a = 10;
		b = 20;
		c = 30;//不可访问,私有变量
		cout << a << "\t" << b << "\t"<< endl;
	}
};
void test() {
	A a1;
	a1.a = 100;
	a1.b = 200;//不可访问,保护变量
	a1.c = 300;//不可访问,私有变量
	a1.fun();
	
}

2、保护继承protected

class B :protected S {
public:
	void fun() {
		a = 10;//公有变保护
		b = 20;
		//c = 30;//不可访问
		cout << a << "\t" << b << "\t" << endl;
	}
};
void test() {
	B a1;
	a1.a = 100;//不可访问,变为了保护变量
	a1.b = 200;//不可访问
	a1.c = 300;//不可访问
	a1.fun();
}

3、私有继承private

class C :private S {
public:
	void fun() {
		a = 10;//公有变保护
		b = 20;
		//c = 30;//不可访问
		cout << a << "\t" << b << "\t" << endl;
	}
};
//孙类
class Grand :public C {
public:
	void fun() {
		a = 10;//已变为私有,不可访问
		b = 20;//不可访问
		//c = 30;//不可访问
		cout << a << "\t" << b << "\t" << endl;
	}
};
void test() {
	B a1;
	a1.a = 100;//不可访问,变为了私有变量
	a1.b = 200;//不可访问,变为了私有变量
	a1.c = 300;//不可访问
	a1.fun();
}

三、对象模型

父类中所有的非静态成员属性都会被子类继承,父类中私有的成员属性被编译器隐藏不可访问但被继承。

class S {
public:
	int a;
protected:
	int b;
private:
	int c;
};
class A :public S {
public:
	int d;
};
void test() {
	cout << "size of A子类:" << sizeof(A) << endl;//父类中所有的非静态成员属性都会被子类继承,父类中私有的成员属性被编译器隐藏不可访问但被继承。
}

在这里插入图片描述
注:利用开发人员命令工具查看对象模型
首先打开开始文档的vs开发人员命令提示工具
在这里插入图片描述

在这里插入图片描述
查看命名:cl /d1 reportSingleClassLayout查看的类名 所属文件名
在这里插入图片描述
在这里插入图片描述

四、继承中的构造与析构顺序

子类继承父类后,当创建子类对象,也会调用父类的构造函数
在这里插入图片描述
先构造父类,再构造子类,析构的顺序与构造的顺序相反

五、同名成员处理方式

1、访问子类同名成员,直接访问即可
2、访问父类同名成员,需要加载作用域(子类实例化名.父类名::成员属性/函数
3、当子类中出现和父类同名的成员函数,子类的同名成员函数会隐藏掉父类中所有同名成员函数(包括重载的),如果想访问到需要加作用域

同名静态成员处理方法

规则和同名成员处理方式一样,只多了一种访问方式。

class S {
public:
	static int a;
	static void fun() {
		cout << "子类下的函数" <<  endl;
	}
	static void fun(int a) {
		cout << "子类下的函数(有参数)" << endl;
	}
protected:
	int b;
private:
	int c;
};
int S::a = 10;
class A :public S {
public:
	int d;
	static int a;
	static void fun() {
		cout << "子类下的函数" << endl;
	}
};
int A::a = 100;
void test() {
	//通过对象访问
	A a1;
	cout <<"子类下" << a1.a << endl;
	cout << "父类下" << a1.S::a << endl;
	a1.fun();
	a1.S::fun();
	//通过类名
	cout << "子类下" << A::a << endl;
	//第一个::代表通过类名方式访问,第二个::代表访问父类作用域下
	cout << "父类下" << A::S::a << endl;
	A::fun();
	A::S::fun();
	A::S::fun(100);
}

六、多继承语法(不建议使用)

语法:class 子类:继承方式 父类1,继承方式 父类2...
可能会引发父类中同名,不明确出现二义性,可以使用作用于访问父类中的同名。
可以使用对象模型查看

class S {
public:
	int a;
	S() {
		a = 10;
	}
};
class S1 {
public:
	int b;
	S1() {
		b = 20;
	}
};
class A :public S ,public S1{
public:
	int c;
	int d;
	A() {
		c = 30;
		d = 40;
	}
};

七、菱形继承(钻石继承)

概念:
1、两个派生类继承同一个基类
2、又有某个类同时继承两个派生类
菱形继承
资源浪费
在这里插入图片描述
利用虚继承解决菱形继承的问题,加关键字virtual,父类被称为虚基类。虚继承数据只有一个。
虚继承

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

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

相关文章

Pandas 教程

文章目录 Pandas1. Pandas介绍2. Series2.1 Series 的创建2.1.1 列表创建2.1.2 NumPy 数组创建2.1.3 字典创建2.1.4 Series 参数 2.2 Series 的索引2.2.1 显式索引2.2.2 隐式索引2.2.3 修改索引2.2.4 通过索引获取值2.2.5 通过索引修改值 2.3 Series 的切片2.3.1 显式切片2.3.2…

《WebKit 技术内幕》之五(4): HTML解释器和DOM 模型

4 影子&#xff08;Shadow&#xff09;DOM 影子 DOM 是一个新东西&#xff0c;主要解决了一个文档中可能需要大量交互的多个 DOM 树建立和维护各自的功能边界的问题。 4.1 什么是影子 DOM 当开发这样一个用户界面的控件——这个控件可能由一些 HTML 的标签元素…

在WIN从零开始在QMUE上添加一块自己的开发板(一)

文章目录 一、前言二、源码编译&#xff08;一&#xff09;安装Msys2&#xff08;二&#xff09;配置GCC工具链&#xff08;三&#xff09;安装QEMU构建依赖&#xff08;四&#xff09;下载编译QEMU源码 二、QUME编程基础&#xff08;一&#xff09;QOM机制&#xff08;二&…

基于SpringBoot Vue档案管理系统

大家好✌&#xff01;我是Dwzun。很高兴你能来阅读我&#xff0c;我会陆续更新Java后端、前端、数据库、项目案例等相关知识点总结&#xff0c;还为大家分享优质的实战项目&#xff0c;本人在Java项目开发领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目&#x…

ClickHouse与Doris数据库比较

概述 都说“实践是检验真理的唯一标准”&#xff0c;光说不练假把式&#xff0c;那么本文就通过实际的测试来感受一下Doris和clickhouse在读写方面的性能差距&#xff0c;看看Doris盛名之下&#xff0c;是否真有屠龙之技&#xff1b;clickhouse长锋出鞘&#xff0c;是否敢缚苍…

Vagrant创建Oracle RAC环境示例

利用Vagrant安装Oracle RAC&#xff08;默认为non-CDB模式&#xff09;&#xff0c;生成2台虚机&#xff0c;耗时约1小时。 node1: -----------------------------------------------------------------node1: INFO: 2024-01-11 18:25:54: Make create database commandnode1: …

多人在线聊天交友工具,匿名聊天室网站源码,附带搭建教程

源码介绍 匿名聊天室&#xff08;nodejs vue&#xff09; 多人在线聊天交友工具&#xff0c;无需注册即可畅所欲言&#xff01;你也可以放心讲述自己的故事&#xff0c;说出自己的秘密&#xff0c;因为谁也不知道对方是谁。 运行说明 安装依赖项&#xff1a;npm install 启动…

react学习笔记(复习)

React简介 react是什么&#xff1f; React用于构建用户界面的JS库。是一个将数据渲染为HTML视图的开源JS库。 为什么学&#xff1f; 1.原生JS操作DOM繁琐&#xff0c;效率低 2.使用JS直接操作DOM,浏览器会进行大量的重绘重排 3.原生JS没有组件化编码方案&#xff0c;代码…

Linux-ionde(软硬件链接)剖析

概述 文件是存储在硬盘上的&#xff0c;硬盘的最小存储单位叫做扇区sector&#xff0c;每个扇区存储512字节。操作系统读取硬盘的时候&#xff0c;不会一个个扇区地读取&#xff0c;这样效率太低&#xff0c;而是一次性连续读取多个扇区&#xff0c;即一次性读取一个块block。这…

OpenAI的DALL·e2生成的AI图像有时会带有偏见或NSFW

专家警告说&#xff0c;OpenAI的图像生成模型DALLe2可能玩起来很有趣&#xff0c;但它生成的图片可能会带有刻板印象和偏见&#xff0c;甚至是生成NSFW图片&#xff0c;因此在现实世界中部署会有风险。 OpenAI公司承认“如果没有足够的防护措施&#xff0c;像DALLe2这样的模型…

k8s节点RouteCreated为false

出现该情况后&#xff0c;一般是初始化节点失败。因此&#xff0c;需要把节点从集群中移除&#xff0c;再加入到集群中&#xff0c;即可解决。 通常出现这个状况后&#xff0c;该节点上是没有被分配pod ip的&#xff0c;可以通过命令查看&#xff1a; # 发现没有PodCIDR、PodC…

DHCP原理

目录 DHCP应用场景DHCP基本原理DHCP报文类型地址池DHCP工作原理DHCP租期更新DHCP重绑定IP地址释放 DHCP应用场景 在大型企业网络中&#xff0c;会有大量的主机或设备需要获取IP地址等网络参数。如果采用手工配置&#xff0c;工作量大且不好管理&#xff0c;如果有用户擅自修改网…

vue3前端开发,子组件向父组件传递数据练习

vue3前端开发,子组件向父组件传递数据练习&#xff01; <script setup> import Child from ./Child.vue const getMsg (msg)>{console.log(msg); } </script> <template><h3>Parent</h3><!--绑定事件--><Child get-Msg"getM…

回调地狱与解决方案

什么是回调地狱&#xff1f; 简单理解就是回调函数嵌套回调 示例&#xff1a; setTimeout(() > {console.log(1);setTimeout(() > {console.log(2);setTimeout(() > {console.log(3);}, 1000);}, 2000)}, 3000)如上代码所示&#xff0c;回调函数嵌套回调&#xff0c;就…

QoS简介

QoS产生的背景 网络的普及和业务的多样化使得互联网流量激增&#xff0c;从而产生网络拥塞&#xff0c;增加转发时延&#xff0c;严重时还会产生丢包&#xff0c;导致业务质量下降甚至不可用。所以&#xff0c;要在网络上开展这些实时性业务&#xff0c;就必须解决网络拥塞问题…

电商系统设计到开发02 单机性能压测

一、前言 接着上篇文章&#xff1a;电商系统设计到开发&#xff08;第一版&#xff09;-CSDN博客 已经开发的代码&#xff0c;今天我们对上面开发的代码进行压力测试&#xff0c;看看单机部署的情况下&#xff0c;性能表现如何。代码地址&#xff1a;风萧萧兮/concurrency-en…

Linux中关于head命令详解

head的作用 head用于查看文件的开头部分的内容。 head的参数 -q隐藏文件名-v 显示文件名-c<数目>显示的字节数-n<数目>显示的行数 head的案例 # 查看yum.log前五行内容 head -5 yum.log

对于随机生成图片接口浏览器走缓存的问题

前提场景 目前有一个api 他可以随机生成一张图片&#xff0c;我通过v-for循环一个Array渲染出来几个img 并且都调用了该接口&#xff0c;但是每个img都是一样的图片 具体代码如下 <div class"icon-group-box" v-for"item in groupList" :key"item…

Oracle篇—参数文件在11gRAC或12cRAC的启动位置介绍

☘️博主介绍☘️&#xff1a; ✨又是一天没白过&#xff0c;我是奈斯&#xff0c;DBA一名✨ ✌✌️擅长Oracle、MySQL、SQLserver、Linux&#xff0c;也在积极的扩展IT方向的其他知识面✌✌️ ❣️❣️❣️大佬们都喜欢静静的看文章&#xff0c;并且也会默默的点赞收藏加关注❣…

让Mac与Windows合二为一:Microsoft Remote Desktop for Mac的魅力

在数字时代&#xff0c;远程连接已成为工作、学习和生活的必备工具。而Microsoft Remote Desktop for Mac正是这样一款能够让你随时随地&#xff0c;轻松连接到Windows系统的强大工具。 Microsoft Remote Desktop for Mac不仅提供了高效、稳定的远程访问体验&#xff0c;更凭借…