【C++类与对象】继承

继承

  • 一、继承基本语法
  • 二、继承方式
    • 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,父类被称为虚基类。虚继承数据只有一个。
虚继承

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

R 语言学习 case3:柱状图(ggchart)

主要涉及到对图的优化&#xff0c;使用ggchart工具包 ggchart 链接&#xff1a;https://thomas-neitmann.github.io/ggcharts/index.html step1: 安装工具包 install.packages("ggcharts") install.packages("tidytext")step2: 导入工具包 library(dplyr…

高性能前端UI库 SolidJS | 超棒 NPM 库

SolidJS是一个声明式的、高效的、编译时优化的JavaScript库&#xff0c;用于构建用户界面。它的核心特点是让你能够编写的代码既接近原生JavaScript&#xff0c;又能够享受到现代响应式框架提供的便利。 SolidJS的设计哲学强调了性能与简洁性。它不使用虚拟DOM&#xff08;Vir…

makefile中的伪目标和模式匹配

文章目录 makefile&#xff0c;伪目标和模式匹配 makefile&#xff0c;伪目标和模式匹配 伪目标 .PHONY:clean 声明目标为伪目标之后&#xff0c;makefile将不会判断目标是否存在或该目标是否需要更新, 简单来说就是不会受到一些同名的文件的影响&#xff0c;也会进来makefi…

Ubuntu使用docker-compose安装mysql8或mysql5.7

ubuntu环境搭建专栏&#x1f517;点击跳转 Ubuntu系统环境搭建&#xff08;十四&#xff09;——使用docker-compose安装mysql8或mysql5.7 文章目录 Ubuntu系统环境搭建&#xff08;十四&#xff09;——使用docker-compose安装mysql8或mysql5.7MySQL81.新建文件夹2.创建docke…

ERP进出库+办公用品管理系统

系统架构 简介系统架构部分页面结构图UML逻辑图办公用品入出库 简介 本系统适用于ERP企业公司职员关于系统化的申请相关办公用品&#xff0c;提高整体系统整合行&#xff0c;加大上下级之间的联系&#xff0c;规避因人员过多&#xff0c;而浪费人力在简单重复的工作中&#xf…

Python项目——搞怪小程序(PySide6+Pyinstaller)

1、介绍 使用python编写一个小程序&#xff0c;回答你是猪吗。 点击“是”提交&#xff0c;弹窗并退出。 点击“不是”提交&#xff0c;等待5秒&#xff0c;重新选择。 并且隐藏了关闭按钮。 2、实现 新建一个项目。 2.1、设计UI 使用Qt designer设计一个UI界面&#xff0c…

【前后端分离与不分离的区别】

Web 应用的开发主要有两种模式&#xff1a; 前后端不分离 前后端分离 理解它们的区别有助于我们进行对应产品的测试工作。 前后端不分离 在早期&#xff0c;Web 应用开发主要采用前后端不分离的方式&#xff0c;它是以后端直接渲染模板完成响应为主的一种开发模式。以前后端不…

探索Vue3:深入理解响应式语法糖

🚀 欢迎来到我的专栏!专注于Vue3的实战总结和开发实践分享,让你轻松驾驭Vue3的奇妙世界! 🌈✨在这里,我将为你呈现最新的Vue3技术趋势,分享独家实用教程,并为你解析开发中的难题。让我们一起深入Vue3的魅力,助力你成为Vue大师! 👨‍💻💡不再徘徊,快来关注…

Java编程练习之this关键字(2)

this关键字除了可以调用成员变量或成员方法之外&#xff0c;还可以作为方法的返回值。 示例&#xff1a;创建一个类文件&#xff0c;在类中定义Book类型的方法&#xff0c;并通过this关键字进行返回。 public class Book{ public Book getBook(){ return this; } } 在getB…

list列表可编辑状态

有时候list需要修改或选择属性,mfc自带的只能显示内容,基本上是不可以修改,为了实现这个功能需求,需要完成一下步骤转换. 第一步记录选择的单元格. 第二步创建一个编辑框CComboBox对象, 设置字体,窗口属性. 第三步获取选中单元格的位置信息. 第四步获取单元格内容信息. 第五步…

图论:最短路(dijkstra算法、bellman算法、spfa算法、floyd算法)详细版

终于是学完了&#xff0c;这个最短路我学了好几天&#xff0c;当然也学了别的算法啦&#xff0c;也是非常的累啊。 话不多说下面看看最短路问题吧。 最短路问题是有向图&#xff0c;要求的是图中一个点到起点的距离&#xff0c;其中我们要输入点和点之间的距离&#xff0c;来求…

【EFCore仓储模式】介绍一个EFCore的Repository实现

阅读本文你的收获 了解仓储模式及泛型仓储的优点学会封装泛型仓储的一般设计思路学习在ASP.NET Core WebAPI项目中使用EntityFrameworkCore.Data.Repository 本文中的案例是微软EntityFrameworkCore的一个仓储模式实现&#xff0c;这个仓储库不是我自己写的&#xff0c;而是使…

Eyes Wide Shut? Exploring the Visual Shortcomings of Multimodal LLMs

大开眼界&#xff1f;探索多模态模型种视觉编码器的缺陷。 论文中指出&#xff0c;上面这些VQA问题&#xff0c;人类可以瞬间给出正确的答案&#xff0c;但是多模态给出的结果却是错误的。是哪个环节出了问题呢&#xff1f;视觉编码器的问题&#xff1f;大语言模型出现了幻觉&…

章鱼网络 Community Call #17|打造全新 Omnity 跨链协议

香港时间2024年1月8日12点&#xff0c;章鱼网络举行第17期 Community Call。 对于 Octopus Community 而言&#xff0c;2023年是一个分水岭。我们如期兑现我们的承诺&#xff0c;成功上线了包括 $NEAR Restaking 和 Adaptive IBC 在内的完整的 Octopus 2.0。 自从我们在2023年…

HarmonyOS 应用开发入门

HarmonyOS 应用开发入门 前言 DevEco Studio Release版本为&#xff1a;DevEco Studio 3.1.1。 Compile SDK Release版本为&#xff1a;3.1.0&#xff08;API 9&#xff09;。 构建方式为 HVigor&#xff0c;而非 Gradle。 最新版本已不再支持 &#xff08;”Java、JavaScrip…

Leetcode的AC指南 —— 栈与队列:225.用队列实现栈

摘要&#xff1a; **Leetcode的AC指南 —— 栈与队列&#xff1a;225.用队列实现栈 **。题目介绍&#xff1a;请你仅使用两个队列实现一个后入先出&#xff08;LIFO&#xff09;的栈&#xff0c;并支持普通栈的全部四种操作&#xff08;push、top、pop 和 empty&#xff09;。 …

web渗透安全学习笔记:2、HTML基础知识

目录 前言 HTML的标题 段落链接与插入图片 HTML元素 HTML属性 HTML头部 HTML与CSS HTML与JavaScript 表格与列表 HTML区块 布局 HTML表单 HTML与数据库 音频与视频 HTML事件 前言 HTML的标题 <!DOCTYPE html> <html> <head> <meta chars…

Spring+SprinMVC+MyBatis注解方式简易模板

SpringSprinMVCMyBatis注解方式简易模板代码Demo GitHub访问 ssm-tpl-anno 一、数据准备 创建数据库test&#xff0c;执行下方SQL创建表ssm-tpl-cfg /*Navicat Premium Data TransferSource Server : 127.0.0.1Source Server Type : MySQLSource Server Version :…

HCIP-BGP实验3

实验步骤 配置IP地址 R1 [r1]int g0/0/0 [r1-GigabitEthernet0/0/0]ip add 12.1.1.1 24 [r1-GigabitEthernet0/0/0]int loopback0 [r1-LoopBack0]ip add 192.168.1.1 24 [r1-LoopBack0]int loopback1 [r1-LoopBack1]ip add 192.168.2.1 24 [r1-LoopBack1]int loopback3 [r1-…

OCS2 入门教程(六)- Double Integrator

系列文章目录 前言 双积分器示例是我们最简单的问题。它模拟了一个沿 x 方向移动的一维点质量。模型是线性的&#xff0c;成本函数是二次函数。目标点通过参考管理器模块设置为二次成本。 一、查看文件结构 1.1 ocs2_double_integrator 文件夹 . ├── auto_generated ├─…