8-1:C++继承之对继承的理解和继承的基本使用,继承的格式

Posted 快乐江湖

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了8-1:C++继承之对继承的理解和继承的基本使用,继承的格式相关的知识,希望对你有一定的参考价值。

一:对继承的理解

面向对象三大特性:封装,继承和多态。其中封装是指将数据和方法整合在一起,并加以作用域限制符进行限定,以达到更好的管理数据的目的,那么继承又应该如何理解呢

在实现一个教务系统时,对于人员大部分都会分为学生,教师这两种,那也就意味着要创建两个个对应的类,学生会有自己的姓名,年龄和学号以及以及拥有查看教务系统和做作业的行为,教师也会有自己的姓名,年龄和工号以及拥有查看教务系统和布置作业的行为。但是很明显的一点是:这两个类有部分的数据和方法其实是重复的,这只是一种极为简单的情况,如果在一些复杂情况中,这些重复的部分不能得到有效复用的话,那么这样的类设计得其实是失败的
在这里插入图片描述

学生和教师他们拥有相同的数据即姓名和年龄,也拥有相同的方法即查看教务系统,所以我们可以把这些相同的部分整合为一个类作为父类(基类),让学生类和教师类继承父类的方法和属性,同时学生类可以带有自己特有的数据和行为即学号和写作业,教师类也可以带有自己特有的数据和行为即工号和布置作业,那么这样的话相同部分也就得到了有效复用,我们把这样的过程称为继承

二:继承的定义

继承的概念很好理解,那么如何用代码完成继承呢?这就是本节的内容
如下有一个Person类作为父类有nameage两个数据,并且有print方法输出nameage,接着有StudentTeacher两个类,他们分别继承父类,写法如下,具体都是什么作用我们后续再说

#include <iostream>
#include <string>
using namespace std;

class Person
{
public:
	void print()
	{
		cout << "姓名" << _name << endl;
		cout << "年龄" << _age << endl;
	}
protected:
	string _name = "Job";
	int _age = 18;
};

class Student : public Person//继承父类
{
private:
	int _Student_ID = 2017151025;
};

class Teacher : public Person//继承父类
{
private:
	int _Teacher_ID = 111907;
};

int main()
{
	Student s1;
	Teacher t1;
	s1.print();
	t1.print();
}

结果显示,PersonStudent也正确输出了内容
在这里插入图片描述

(1)定义格式

从上面的代码中大家也基本明白了如何实现继承,所以继承的定义格式如下
在这里插入图片描述

(2)继承方式和访问限定符

C++中的继承相比于其他语言来说是很麻烦的,它在继承时和访问限定符一样,也有三种方式可以选择
在这里插入图片描述
父类的成员有三种访问方式,而继承方式也有三种,那么当子类继承父类时,父类的数据就有3×3=9种访问情况
在这里插入图片描述

  • 对于前两行,记忆时很简单,首先明确public>protected>private,选择时倾向于选择小的。举例如果父类是protected的,继承方式是private,那么子类中则是private
  • 对于最后一行可以表述为:父类中的private成员在子类中均是不可见的

关于上面,还需要注意以下几点:

1:父类中的private成员在子类中是不可见的,并不是说它不被继承

  • 因为只要是继承,一定会被继承下来。不可见的意思是当父类的成员继承到子类中时,子类的内部也不能访问。如下将父类中的成员设置为Private,并在Student子类中加入一个函数访问继承后的成员_name,会发现编译器报出了错误表示不可访问。
    在这里插入图片描述

  • 去掉访问后,进行调试可以发现_name的的确确存在于子类当中
    在这里插入图片描述

2:父类中的private成员在子类中是不能访问的,更不要说外部了。如果想要让子类访问到private成员,但是外部不要访问,就可以将父类的private的成员改为protected,访问限定符protected也因此而出现

  • 回归最开始的那份代码,并在Student类中加入访问_name的函数,可以发现在子类中是可以访问到的
    在这里插入图片描述

3:在实际开发一般使用public继承,protectedprivate继承可扩展性不强

以上是关于8-1:C++继承之对继承的理解和继承的基本使用,继承的格式的主要内容,如果未能解决你的问题,请参考以下文章

C++ 类和继承错误:未定义对派生类的引用

C++继承

C++继承

c++实验四 类的继承派生和多态

C++的多重继承

C++继承之C++中不同的继承体系