C++:继承的介绍和深度解析

news2024/12/1 11:53:44

一、继承的概念和定义

        1.什么是继承?

继承,顾名思义:就和现实生活中,孩子继承父母的东西有点类似。比如,你父亲的财产,你可以继承下来,你就可以使用父亲的钱。

官方一点的介绍:

继承 (inheritance) 机制是面向对象程序设计 使代码可以复用 的最重要的手段,它允许程序员在 持原有类特性的基础上进行扩展 ,增加功能,这样产生新的类,称派生类。继承 呈现了面向对象 程序设计的层次结构 ,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用, 承是类设计层次的复用
2.继承的定义和格式
class 派生类的名字  :(冒号)  继承方式    基类的名字
{
     //主体
};
下面是一个继承:apple类没有P()函数,但是它继承了Fruit,所以apple也相当于有了P()类的P()函数。所以使用apple类的对象,调用P()函数,打印出了Fruit;

2.继承类的继承方式和访问限定符

2.1有三种继承方式:

public继承,protected继承和private继承

他们的访问权限:

public>protected>private

2.2继承类访问基类成员的权限

巧记这个权限就是:小小取小,私有特例

基类和派生类的权限,谁的权限小,继承后就是那个权限。对于基类是private的,子类继承不了。

总结:

1.基类private成员无论以什么方式继承到派生类中都是不可见的。这里的不可见是指基类的私有成员还是被继承到了派生类对象中,但是语法上限制派生类对象不管在类里面还是类外面都不能去访问它。
2.基类private成员在派生类中不能被访问,如果基类成员不想在派生类外直接被访问,但需要在派生类中访问,就定义为protected。可以看出保护成员限定符是因继承才出现的。
3.基类的私有成员在子类都是不可见;基类的其他成员在子类的访问方式就是访问限定符和继承方式中权限更小的那个(权限排序:public>protected>private)。
4.使用关键字class时默认的继承方式是private,使用struct时默认的继承方式是public,但最好显式地写出继承方式。

二、基类和派生类

        1.基类和派生类对象赋值转换

class Fruit
{
public:
	void P()
	{
		cout << "Fruit" << endl;
	}
protected:
	string color;
	string name;
};


class apple :public Fruit
{
public:

protected:
	int size;
	string shape;
};

由上面报错行,我们可以看出。基类不能给派生类赋值。(父类不能给子类赋值)。但是子类可以给父类赋值。其实也有道理的。因为子类对父类进行扩展,拥有父类没有的成员。

而子类可以给父类赋值,也是同样的道理。父类有的子类继承了,所以子类给父类赋值时,是可以的。但是并不是将子类的全部成员都赋值过去,只将父类有的部分赋值过去。这种方法叫切割。

2.继承中的作用域

2.1基类和派生类都有自己的作用域

2.2如果父类和子类有相同的成员,那么子类使用是,只会调用自己的。会对继承父类的同名成员进行隐藏,也叫重定义。(也可以显式调用,使用::符号Fruit::_name)

2.3对于成员函数,只要名字一样就构成重定义

上面的apple类,他和Fruit类都有P()函数,当apple的对象调用时,他会调用自己的。对于Fruit类和apple类都有相同成员_name,子类中调用,可以通过Fruit::_name来调用父类的成员

3.派生类的默认成员函数

默认成员函数,我们不写,编译器也会默认生成。

1. 子 类的构造函数必须调用父类的构造函数初始化父类的那一部分成员。如果父类没有默认 的构造函数,则必须在子类构造函数的初始化列表阶段显示调用。(下左图)
2.派生类对象初始化先调用基类构造再调派生类构造。
3. 派生类对象析构清理先调用派生类析构再调基类的析构。(下右图)
4.派生类的析构函数会在被调用完成后自动调用基类的析构函数清理基类成员。因为这样才能保证派生类对象先清理派生类成员再清理基类成员的顺序。下图

 5.派生类的拷贝构造函数必须调用基类的拷贝构造完成基类的拷贝初始化。见下图

class Fruit
{
public:

	Fruit(const string name,const string color) 
		:_name(name)
		,_color(color)
	{ cout << "Fruit()" << endl; }

	Fruit(const Fruit& F){
		cout << "const Fruit& F" << endl;
	}

	 ~Fruit(){cout << "~Fruit()" << endl;}
protected:
	string _color;
	string _name ;
};
class apple :public Fruit
{
public:
	apple(const string name, const string size,const string color)
		:Fruit(name,color)
		, _size(size)
	{
		cout << "apple()" << endl;
	}

	apple (const apple& a) 
		:Fruit(a)
		,_size(a._size)
	{
		cout << "const apple& a" << endl;
	}

	~apple() { cout << "~apple()" << endl; }

protected:
	string _size ;

};
void test()
{
	apple a("apple", "red", "big");
	apple a2("apple","yellow", "big");
	apple p(a);

}

6.赋值运算符重载,必须用父类的运算符重载来完成

 4.继承的其他一些关系

1.友元关系不能继承 ,也就是说基类友元不能访问子类私有和保护成员
2. 基类定义了 static 静态成员,则整个继承体系里面只有一个这样的成员 。无论派生出多少个子 类,都只有一个 static 成员实例

三、单继承和多继承

        1.单继承

2.多继承

3.菱形继承 

下面这个情况也构成菱形继承,并不是严格的菱形才算。

 

原因:因为B和C都继承了A的_a  ,当D继承B和C后,里面的_a不知道用B继承的_a还是用C继承的_a.,尽量不要使用菱形继承,很麻烦

4.解决方法

4.1加前置声明

4.2使用虚继承

关于虚继承是什么,当你学了多态就知道了。可以在我后续的文章看到。

virtual是定义C++中虚函数的关键字 。在面向对象程序设计领域,C++、Object Pascal 等语言中有虚函数(英语:virtual function)或虚方法(英语:virtual method)的概念。这种函数或方法可以被子类继承和覆盖,通常使用动态调度实现。这一概念是面向对象程序设计中(运行时)多态的重要组成部分。简言之,虚函数可以给出目标函数的定义,但该目标的具体指向在编译期可能无法确定。

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

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

相关文章

代码随想录阅读笔记-二叉树【对称二叉树】

题目 给定一个二叉树&#xff0c;检查它是否是镜像对称的。 思路 首先想清楚&#xff0c;判断对称二叉树要比较的是哪两个节点&#xff0c;要比较的可不是左右节点&#xff01; 对于二叉树是否对称&#xff0c;要比较的是根节点的左子树与右子树是不是相互翻转的&#xff0…

2024 ccfcsp认证打卡 2021 12 01 序列查询

2021 12-1 序列查询 题解1题解2区别第一种算法&#xff1a;第二种算法&#xff1a; 题解1 import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);// 输入n表示商品数目&#xff0c;N表示总数int n sc.n…

使用Vite安装TailwindCSS

一、认识TailwindCSS Tailwind CSS 是一个基于原子类的 CSS 框架&#xff0c;它提供了一种不同于传统 CSS 框架的方式来构建用户界面。下面是关于 Tailwind CSS 的优缺点以及它适合应用的情况&#xff1a; 优点&#xff1a; 灵活性&#xff1a; Tailwind CSS 提供了大量的原…

Portal Particle

Unity3D Portal Particle 2.2传送门粒子效果 链接&#xff1a;https://pan.baidu.com/s/1TCMXIif5d288lXHgixnDPw?pwd1234 下载&#xff1a;资源下载链接 效果图&#xff1a;

Java虚拟机(JVM)知识点总结

一. Java内存区域 1. JVM的内存区域划分&#xff0c;以及各部分的作用 可分为运行时数据区域和本地内存&#xff0c;按照线程私有和线程共享分类&#xff1a; 线程私有&#xff1a;程序计数器、虚拟机栈、本地方法栈。 线程共享&#xff1a;堆、方法区、直接内存。 JDK1.7…

V R虚拟现实元宇宙的前景|虚拟现实体验店加 盟合作|V R设备在线购买

VR&#xff08;虚拟现实&#xff09;技术作为一种新兴的技术&#xff0c;正在逐渐改变人们的生活和工作方式。随着技术的不断进步&#xff0c;人们对于元宇宙的概念也越来越感兴趣。元宇宙是一个虚拟世界&#xff0c;通过VR技术可以实现人们在其中进行各种活动和交互。 元宇宙的…

(C++17) std算法之执行策略 execution

文章目录 前言Code测试Code运行效果 msvc源码描述源码std::sequenced_policy seqstd::parallel_policy parstd::parallel_unsequenced_policy par_unseqstd::unsequenced_policy unseq END 前言 ref:算法库-执行策略 - cppreference.com 利用多核cpu加速算法在目前看来已经不是…

Springboot+MybatisPlus+EasyExcel实现文件导入数据

记录一下写Excel文件导入数据所经历的问题。 springboot提供的文件处理MultipartFile有关方法&#xff0c;我没有具体看文档&#xff0c;但目测比较复杂&#xff0c; 遂了解学习了一下别的文件上传方法&#xff0c;本文第1节记录的是springboot原始的导入文件方法写法&#xf…

论文阅读-《Lite Pose: Efficient Architecture Design for 2D Human Pose Estimation》

摘要 这篇论文主要研究了2D人体姿态估计的高效架构设计。姿态估计在以人为中心的视觉应用中发挥着关键作用&#xff0c;但由于基于HRNet的先进姿态估计模型计算成本高昂&#xff08;每帧超过150 GMACs&#xff09;&#xff0c;难以在资源受限的边缘设备上部署。因此&#xff0…

vue的创建、启动以及目录结构详解

vue的创建、启动以及目录结构详解目录 一. vue项目的创建 二. vue的目录结构 三. src的目录结构 四. vue项目的启动 4.1 方法1 4.2 方法2 一. vue项目的创建 创建一个工程化的Vue项目&#xff0c;执行命令&#xff1a;npm init vuelatest 注意&#xff1a;如果你在这个目…

【Python基础教程】3 . 算法的时间复杂度

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;python基础教程 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、…

[每周一更]-第91期:认识AMD的CPU

这一章来认识下AMD,说起AMD&#xff0c;从我上大学那时候&#xff0c;就选购的AMD 速龙系列&#xff0c;生活拮据的情况下&#xff0c;拉着室友去郑州电子城&#xff0c;在跟奸商老板的拉扯下&#xff0c;斥资2000购入一个无显卡 的台式机&#xff08;实在是资金有限&#xff0…

【Spring源码】WebSocket做推送动作的底层实例

一、前瞻 Ok&#xff0c;开始我们今天的对Spring的【模块阅读】。 那就挑Web里的WebSocket模块&#xff0c;先思考下本次阅读的阅读线索&#xff1a; WebSocket在Spring里起到什么作用这个模块采用了什么设计模式我们都知道WebSocket可以主动推送消息给用户&#xff0c;那做推…

小程序中使用less

在vscode中安装插件 找到左下角齿轮的设置&#xff0c;点击右边图标&#xff0c;进入“settings.json” 加上以下代码配置 "less.compile":{"outExt": ".wxss"}

在.Net6中用gdal实现第一个功能

目录 一、创建.NET6的控制台应用程序 二、加载Gdal插件 三、编写程序 一、创建.NET6的控制台应用程序 二、加载Gdal插件 Gdal的资源可以经过NuGet包引入。右键单击项目名称&#xff0c;然后选择 "Manage NuGet Packages"&#xff08;管理 NuGet 包&#xff09;。N…

揭秘情绪识别:如何让AI读懂你的心声?

最近我在研究大语言模型&#xff0c;想用它来给样本打分。 起初&#xff0c;我尝试让模型用1到5分来评分&#xff0c;但它总是极端地给出最低分或最高分&#xff0c;评分缺乏中间地带。 于是我换了个方法&#xff0c;不再用数字&#xff0c;而是用描述性的词语&#xff0c;比…

《让你的时间多一倍》逃离时间陷阱,你没有自己想的那么懒 - 三余书屋 3ysw.net

让你的时间多一倍 今天我们来阅读法比安奥利卡尔的作品《让你的时间多一倍》。或许你会心生疑虑&#xff0c;这本书是否又是一本沉闷的时间管理指南&#xff1f;但我要告诉你的是&#xff0c;尽管时间管理这个话题已经为大众所熟知&#xff0c;这本书却为我们揭示了一个全新的…

php将网页用wkhtmltoimage内容生成为图片

php架构ThinkPHP6 1. 安装 knp-snappy架构 composer require knplabs/knp-snappy use Knp\Snappy\Image; use Illuminate\Support\Facades\Storage;// 生成图片 /user/local/bin/wkhtmltoimage为你的wkhtmltoimage的位置。 $snappy new Image(/usr/local/bin/wkhtmltoimage…

EXCEL VBA根据表数据写入数据库中

EXCEL VBA根据表数据写入数据库中 Option Explicithttps://club.excelhome.net/thread-1687531-1-1.htmlSub UpdateAccess()Const adStateOpen 1Dim vData, i As Variant, j As LongDim AccessTable As String, ExcelTable As String, ExcelFile As String, AccessFile As Str…

【JavaWeb】Day27.Web入门——Tomcat介绍

目录 WEB服务器-Tomcat 一.服务器概述 二.Web服务器 三.Tomcat- 基本使用 1.下载 2.安装与卸载 3.启动与关闭 4.常见问题 四.Tomcat- 入门程序 WEB服务器-Tomcat 一.服务器概述 服务器硬件&#xff1a;指的也是计算机&#xff0c;只不过服务器要比我们日常使用的计算…