什么是继承性?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.易于扩展

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

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

  1. 层次结构清晰

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

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

二、继承的注意事项

  1. 避免过度继承

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

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

  1. 保持单一职责原则

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

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

3.谨慎使用多重继承:

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

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

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

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

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

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

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

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

相关推荐
倔强的石头1061 分钟前
【C++经典例题】字符串转整数(atoi)的实现与解析
开发语言·c++
LoveXming4 分钟前
Qt零散知识点
开发语言·qt
ALex_zry6 分钟前
构建高可靠C++服务框架:从日志系统到任务调度器的完整实现
开发语言·c++·wpf
_zwy8 分钟前
【Linux 进程控制】—— 进程亦生生不息:起于鸿蒙,守若空谷,归于太虚
linux·运维·服务器·c++
du fei9 分钟前
C# 组件的使用方法
java·开发语言·c#
小阳拱白菜11 分钟前
蓝桥杯刷题--挖矿
算法·职场和发展·蓝桥杯
补三补四12 分钟前
【深度学习基础】——机器的神经元:感知机
人工智能·深度学习·算法·机器学习
VBA633716 分钟前
VBA之Word应用:利用Range方法进行字体及对齐方式设置
开发语言
Eiceblue20 分钟前
使用Python写入JSON、XML和YAML数据到Excel文件
xml·开发语言·vscode·python·json·excel·pip
ZHW_AI课题组23 分钟前
基于线性回归模型的汽车燃油效率预测
算法·汽车·线性回归