前言
目录
很多时候,我们需要定义有血缘关系的类,比如说:
-
Person类
-
Student类
学生属于学生类,而学生也具有人类的一切属性,假设学生类多出了一个学号
的成员变量
按照传统,我们可以这样来写代码:
// 人类
class Person {
public:
private:
string _name;
int _age;
string _sex;
};
// 学生类
class Student {
public:
private:
string _name;
int _age;
string _sex;
string _StuID;
};
我们很快就发现了一个问题,人类和学生类之中有3个成员变量是重复的,代码看上去十分的冗余
那么怎么来解决呢?
可以在学生类里面声明一个人的对象:
// 学生类
class Student {
public:
private:
Person p;
string _StuID;
};
但是有个问题:Person类的私有成员变量只能在Person类内访问,无法在Student类里访问,如果要访问只能用友元类来解决
// 人类
class Person {
friend class Student;
public:
private:
string _name;
int _age;
string _sex;
};
是不是有点烦了,并且更重要的是,友元破坏了类的封装
我也感觉是这样,那让我们来看看继承
!
1. 继承的概念
继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用
而继承是类级别的复用
被继承的叫做父类/基类
,去继承的叫做子类/派生类
上面的学生类只需这样改进:
// 学生类
class Student: public Person{
public:
private:
string _StuID;
};
2.继承基类成员访问方式的变化
类的访问限定符有3种public private protected
,继承方式有3种public private protected
,所以继承了父类之后,子类中继承下来的成员有3×3=9种
情况
类成员/继承方式 | public继承 | protected继承 | private继承 |
---|---|---|---|
基类的public成员 | 派生类的public |