8-1:C++继承之对继承的理解和继承的基本使用,继承的格式
Posted 快乐江湖
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了8-1:C++继承之对继承的理解和继承的基本使用,继承的格式相关的知识,希望对你有一定的参考价值。
一:对继承的理解
面向对象三大特性:封装,继承和多态。其中封装是指将数据和方法整合在一起,并加以作用域限制符进行限定,以达到更好的管理数据的目的,那么继承又应该如何理解呢
在实现一个教务系统时,对于人员大部分都会分为学生,教师这两种,那也就意味着要创建两个个对应的类,学生会有自己的姓名,年龄和学号以及以及拥有查看教务系统和做作业的行为,教师也会有自己的姓名,年龄和工号以及拥有查看教务系统和布置作业的行为。但是很明显的一点是:这两个类有部分的数据和方法其实是重复的,这只是一种极为简单的情况,如果在一些复杂情况中,这些重复的部分不能得到有效复用的话,那么这样的类设计得其实是失败的。
学生和教师他们拥有相同的数据即姓名和年龄,也拥有相同的方法即查看教务系统,所以我们可以把这些相同的部分整合为一个类作为父类(基类),让学生类和教师类继承父类的方法和属性,同时学生类可以带有自己特有的数据和行为即学号和写作业,教师类也可以带有自己特有的数据和行为即工号和布置作业,那么这样的话相同部分也就得到了有效复用,我们把这样的过程称为继承
二:继承的定义
继承的概念很好理解,那么如何用代码完成继承呢?这就是本节的内容
如下有一个Person
类作为父类有name
和age
两个数据,并且有print
方法输出name
和age
,接着有Student
和Teacher
两个类,他们分别继承父类,写法如下,具体都是什么作用我们后续再说
#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();
}
结果显示,Person
和Student
也正确输出了内容
(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
继承,protected
和private
继承可扩展性不强
以上是关于8-1:C++继承之对继承的理解和继承的基本使用,继承的格式的主要内容,如果未能解决你的问题,请参考以下文章