什么是继承性?C++中如何实现继承? 继承的好处和注意事项有哪些?

1) 什么是继承性?C++中如何实现继承? 

一、继承性的概念

继承性是面向对象编程中的一个重要特性,它允许一个类(称为子类或派生类)继承另一个类(称为父类或基类)的属性和方法。继承的主要目的是实现代码的重用和扩展。通过继承,可以在已有类的基础上创建新的类,新类可以继承父类的成员变量和成员函数,同时还可以添加自己的新成员。这样可以减少代码的重复编写,提高开发效率,并且使代码更加易于维护和扩展。

二、C++中实现继承的方式

在 C++中,使用冒号(:)来表示继承关系。以下是一个简单的示例:

#include<iostream>
using namespace std;class A
{
public:int num;void fun1(){
		cout << "A fun" << endl;}
};
//继承就是通过已经存在的类创建新的类
class B :public A
{void fun2(){
		cout << "B fun" << endl;}};
int main()
{
	B b;
	b.num = 2;
	b.fun1();return 0;
}

在上面的例子中,B类继承自A类,使用public继承方式。这意味着B类可以访问A类中的public成员。在main函数中,可以通过B类的对象调用从A类继承来的fun1函数以及B类自己的fun2函数。

C++中有三种继承方式:

public继承:

#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
/*
	成员权限:
	private:私有的  只能在本类内访问
	protected :受保护的 本类和子类可以访问
	public: 公有的 本类 子类 对象都可以访问
*/
//继承权限会缩小父类中的成员在子类中的权限,不会扩大成员的权限class father
{private:int pri;
protected:int pro;
public:int pub;
};//公有的方式继承father,pri仍然不可访问,pro仍然是受保护的,pub仍然是公有的
class son : public father  //son继承了类father,father中包含的 son中也包含
{void fun(){//pri = 1; 因为 pri在father中是私有的所以不能再子类中访问
		pro = 1; //pro在son中仍然是受保护的
		pub = 1;//pub在son中是受保护的}
};class grandson :public son
{void fun(){//因为pro是受保护的所以可以在grandson中访问//因为pub是公有的的所以可以在grandson中访问
		pro = 1;
		pub = 1;}
};int main()
{
	son s;	s.pro = 2;//错误因为pro和pub是受保护的所以不可以通过对象访问
	s.pub = 2;//因为pub是公有的的所以可以通过对象访问return 0;
}

protected继承:

#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
/*
	成员权限:
	private:私有的  只能在本类内访问
	protected :受保护的 本类和子类可以访问
	public: 公有的 本类 子类 对象都可以访问
*/
//继承权限会缩小父类中的成员在子类中的权限,不会扩大成员的权限class father
{private:int pri;
protected:int pro;
public:int pub;};//以受保护的方式继承father,那么father中的公有成员在son中的访问权限是受保护的
class son : protected father  //son继承了类father,father中包含的 son中也包含
{void fun(){//pri = 1; 错误因为 pri在father中是私有的所以不能再子类中访问
		pro = 1; //pro在son中仍然是受保护的
		pub = 1;//pub在son中是受保护的}
};class grandson :public son
{void fun(){//因为pro和pub是受保护的所以可以在grandson中访问
		pro = 1;
		pub = 1;}
};int main()
{
	son s;//因为pro和pub是受保护的所以不可以通过对象访问
	s.pro = 2;//错误
	s.pub = 2;//错误return 0;
}

private继承:

#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
/*
	成员权限:
	private:私有的  只能在本类内访问
	protected :受保护的 类内和子类可以访问
	public: 公有的 类内 子类 对象都可以访问
*/class father
{private:int pri;
protected:int pro;
public:int pub;};//以私有的方式继承父类,父类中的所有成员在子类中的权限都是私有的
class son : private father  //son继承了类father,father中包含的 son中也包含
{void fun(){//pri = 1; 错误因为 pri在father中是私有的所以不能再子类中访问
		pro = 1;
		pub = 1;}
};//因为son以私有的方式继承了father,所以father中的成员在son中都是私有的,所以son的子类 grandson 不能访问 pro和pub
class grandSon :public son
{void fun(){
		pro = 1;//错误
		pub = 1;//错误}
}

2)继承的好处和注意事项有哪些? 

一、继承的好处

1. 代码复用

继承允许子类继承父类的属性和方法,避免了重复编写相同的代码。如果多个类具有相同的属性和行为,通过继承可以将这些共同的部分提取到父类中,子类只需要定义自己特有的属性和方法,从而减少了代码量,提高了开发效率。

例如,有多个图形类,如圆形、矩形和三角形,它们都有一些共同的属性如颜色和位置,以及一些共同的方法如绘制和移动。可以创建一个图形基类,包含这些共同的属性和方法,然后让各个具体的图形类继承这个基类,从而实现代码的复用。

2. 易于扩展

当需要添加新的功能或修改现有功能时,可以在子类中进行扩展而不影响父类和其他子类的代码。这种方式使得软件的扩展更加容易,并且可以保持代码的稳定性和可维护性。

比如,在一个电商系统中,有一个商品类作为父类,后来需要添加一种特殊的商品类型,如限时折扣商品。可以创建一个限时折扣商品子类,继承商品类的基本属性和方法,并添加限时折扣相关的特殊属性和方法,而不会影响其他普通商品类的代码。

3. 层次结构清晰

继承可以建立清晰的类层次结构,使得代码的组织结构更加合理,易于理解和维护。通过继承关系,可以直观地看出类之间的关系和职责分工,提高代码的可读性。

例如,在一个动物分类系统中,可以创建一个动物基类,然后派生出哺乳动物类、鸟类、爬行动物类等子类,再进一步派生出具体的动物种类子类,如狗类、猫类、麻雀类、蛇类等。这样的层次结构清晰地展示了动物之间的分类关系。

二、继承的注意事项

1. 避免过度继承

过度使用继承可能会导致类层次结构过于复杂,增加代码的维护难度。当子类过多地依赖父类的实现细节时,父类的任何修改都可能影响到多个子类,导致连锁反应。

例如,如果一个子类继承了一个非常庞大的父类,并且仅仅使用了父类中的一小部分功能,这种情况下可能会导致代码的冗余和复杂性增加。应该考虑使用组合或委托等方式来替代过度的继承。

2. 保持单一职责原则

每个类应该只有一个明确的职责,继承关系也应该遵循这一原则。父类和子类的职责应该清晰明确,避免一个类承担过多的功能。这样可以提高代码的可维护性和可扩展性。

例如,一个员工类不应该既负责员工的基本信息管理,又负责员工的绩效考核功能。可以将员工的基本信息管理和绩效考核功能分别提取到不同的类中,然后通过组合的方式在员工类中使用这些功能。

3. 谨慎使用多重继承:

在一些编程语言中支持多重继承,即一个子类可以继承多个父类。然而,多重继承可能会导致菱形继承问题,即多个父类具有相同的祖先类,从而引起二义性和复杂性。

例如,在 C++中,如果一个子类同时继承了两个父类,而这两个父类又都继承自同一个基类,那么在子类中访问基类的成员时可能会出现二义性。在使用多重继承时,需要特别小心地处理这种情况,确保代码的正确性和可读性。

4. 注意继承的访问权限控制:

不同的编程语言对继承的访问权限控制方式有所不同。在使用继承时,需要了解和正确使用访问权限控制,以确保类的成员能够被正确地访问和修改。

例如,在 C++中,有 public、protected 和 private 三种继承方式,分别控制父类成员在子类中的访问权限。如果使用不当,可能会导致意外的访问错误或安全漏洞。

5. 考虑继承与组合的选择:

在某些情况下,组合(将一个类的对象作为另一个类的成员)可能比继承更加合适。组合可以提供更大的灵活性和可维护性,避免了继承带来的一些问题。

例如,一个汽车类可以包含一个发动机类的对象,而不是继承自发动机类。这样可以更好地控制汽车和发动机之间的关系,并且可以方便地更换不同类型的发动机而不影响汽车类的其他部分。

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

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

相关文章

唇形同步视频生成工具:Wav2Lip

一、模型介绍 今天介绍一个唇形同步的工具-Wav2Lip&#xff1b;Wav2Lip是一种用于生成唇形同步&#xff08;lip-sync&#xff09;视频的深度学习算法&#xff0c;它能够根据输入的音频流自动为给定的人脸视频添加准确的口型动作。 &#xff08;Paper&#xff09; Wav2Lip模型…

ESP32使用TCA9548A IIC多路复用器拓展

ESP32使用TCA9548A IIC多路复用器拓展 本文将讲述如何使用TCA9458A IIC多路复用器扩展IIC总线端口。使用相同的IIC地址控制多个IIC设备&#xff0c;如多个OLED或BME280等 TCA9548介绍 IIC通信协可以实现在同一IIC总线上与多个IIC设备通信&#xff0c;只要所有设备都具有唯一…

BGP路径属性与路由反射器

BGP路径属性 路径属性&#xff1a; 任何一条BGP路由都拥有多个路径属性 当路由器将BGP路由通告给它的对等体时&#xff0c;一并被通告的还有路由所携带的各各路径属性 BGP的路径属性将影响路由优选 路径四个属性分类&#xff1a; 公认必遵&#xff1a;必须包括在每个upda…

C语言期末考试——重点考点

目录 1.C语言的结构 2.三种循环结构 3.逻辑真假判断 4. printf函数 5. 强制类型转化 6. 多分支选择结构 7. 标识符的定义 8. 三目运算符 1.C语言的结构 选择结构、顺序结构、循环结构 2.三种循环结构 for、while、do-while 3.逻辑真假判断 C语言用0表示false,用非0(不…

ci/cd配置任务超时时间

有两个地方决定了任务超时时间&#xff1a; 1. 2.gitlab-runner

JUC:Synchronized和锁升级

1. 面试题 谈谈你对Synchronized的理解Sychronized的锁升级你聊聊Synchronized实现原理&#xff0c;monitor对象什么时候生成的&#xff1f;知道monitor的monitorenter和monitorexit这两个是怎么保证同步的嘛&#xff1f;或者说这两个操作计算机底层是如何执行的偏向锁和轻量级…

梯度下降法以及 Python 实现

文章目录 1. 引言2. 梯度法3. 例子4. 代码实现5. 讨论 — 学习率 η \eta η5.1 当 η \eta η 设置过大5.2 当 η \eta η 设置过小 参考 1. 引言 梯度下降法&#xff0c;可以根据微分求出的斜率计算函数的最小值。 在人工智能中&#xff0c;经常被应用于学习算法。 2. 梯…

OpenCV-图像阈值

简单阈值法 此方法是直截了当的。如果像素值大于阈值&#xff0c;则会被赋为一个值&#xff08;可能为白色&#xff09;&#xff0c;否则会赋为另一个值&#xff08;可能为黑色&#xff09;。使用的函数是 cv.threshold。第一个参数是源图像&#xff0c;它应该是灰度图像。第二…

详细了解IO分类

按照数据流方向如何划分&#xff1f; 输入流&#xff08;Input Stream&#xff09;&#xff1a;从源&#xff08;如文件、网络等&#xff09;读取数据到程序。 输出流&#xff08;Output Stream&#xff09;&#xff1a;将数据从程序写出到目的地&#xff08;如文件、网络、控…

Appium 安装问题汇总

好生气好生气&#xff0c;装了几天了&#xff0c; opencv4nodejs 和 mjpeg-consumer 就是装不了&#xff0c;气死我了不管了&#xff0c;等后面会装的时候再来完善&#xff0c;气死了气死了。 目录 前言 1、apkanalyzer.bat 2、opencv4nodejs 3、ffmpeg 4、mjpeg-consume…

目标检测知识点总结

1、数据增强 2、指标 3、vit 、swint ViT算法&#xff0c;创新性地将图像划分成一个个patch&#xff0c;并将每个patch展平为一个向量&#xff0c;使得图像数据转化为序列化数据&#xff0c;之后输入到Transformer模型中&#xff0c;实现了Transformer在图像分类任务中的应用。…

Lecture 11 - List,Set,Map

List, Set and Map are all interfaces: they define how these respective types work, but they don’t provide implementation code overview 1. List&#xff08;列表&#xff09;&#xff1a; &#xff08;1&#xff09; 创建、访问和操作列表&#xff1a;ArrayList …

ElfBoard开源项目|基于百度智能云平台的车牌识别项目

本项目基于百度智能云平台&#xff0c;旨在利用其强大的OCR服务实现车牌号码的自动识别。选择百度智能云的原因是其高效的API接口和稳定的服务质量&#xff0c;能够帮助开发者快速实现车牌识别应用。 本项目使用摄像头捕捉图像后&#xff0c;通过集成百度OCR服务的API&#xf…

应对超声波测试挑战,如何选择合适的数字化仪?

一、数字化仪的超声波应用 超声波是频率大于人类听觉范围上限的声学声压&#xff08;声学&#xff09;波。超声波设备的工作频率为20 kHz至几千MHz。表1总结了一些更常见的超声波应用的特征。 每个应用中使用的频率范围都反映了实际情况下的平衡。提高工作频率可以通过提高分…

product/admin/list?page=0size=10field=jancodevalue=4562249292272

文章目录 1、ProductController2、AdminCommonService3、ProductApiService4、ProductCommonService5、ProductSqlService https://api.crossbiog.com/product/admin/list?page0&size10&fieldjancode&value45622492922721、ProductController GetMapping("ad…

博物馆导览系统方案(一)背景需求分析与核心技术实现

维小帮提供多个场所的室内外导航导览方案&#xff0c;如需获取博物馆导览系统解决方案可前往文章最下方获取&#xff0c;如有项目合作及技术交流欢迎私信我们哦~撒花&#xff01; 一、博物馆导览系统的背景与市场需求 在数字化转型的浪潮中&#xff0c;博物馆作为文化传承和知…

Flink学习连载文章11--双流Join

双流 Join 和两个流合并是不一样的 两个流合并&#xff1a;两个流变为 1 个流 union connect 双流 join: 两个流 join&#xff0c;其实这两个流还是原来的&#xff0c;只是满足条件的数据会变为一个新的流。 可以结合 sql 语句中的 union 和 join 的区别。 在离线 Hive 中&…

vue3+wangeditor富文本编辑器详细教程

一、前言 在这篇教程中&#xff0c;我将指导如何使用 Vue 3 和 WangEditor 创建一个功能丰富的富文本编辑器。WangEditor 是一个轻量级的富文本编辑器&#xff0c;它非常适合集成到 Vue 项目中。这个例子展示了如何配置富文本编辑器&#xff0c;包括工具栏、编辑器配置以及如何…

Python学习39天

my_tools.py文件提供工具函数 """ 此文件编写工具函数&#xff0c;供程序员使用 my_tools """def read_confirm_select():"""让用户输入&#xff1a;Y/N&#xff0c;不区分大小写&#xff0c;将用户输入值转为小写返回&#xff…

LCA - Lowest Common Ancestor

LCA - Lowest Common Ancestor https://www.luogu.com.cn/problem/SP14932 题目描述 A tree is an undirected graph in which any two vertices are connected by exactly one simple path. In other words, any connected graph without cycles is a tree. - Wikipedia T…