目录
继承的概念及定义
继承的概念
继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用。
这就比如我们设计一个学生管理系统,学校中有老师,学生,工作人员等,我们要记录他们的信息比如学生有电话,姓名,地址,学号等这些信息。
class Student
{
string _name;
string _tel;
string _add;
int _stuNo;
}
比如教师有电话,姓名,地址,工号这些信息。
class Teacher
{
string _name;
string _tel;
string _add;
int _workNo;
}
这样设计后我们会发现会有很多的重复信息,那么我们可以把重复的信息提取出来,重新建立一个Person类。
class Person
{
string _name;
string _tel;
string _add;
}
那么我们的学生类和教师类就可以复用Person类
class Student
{
Person p;
int _stuNo;
}
class Teacher
{
Person p;
int _workNo;
}
这里的_stuNo和_workNo则是学生类和教师类自己独有的变量。
下面是完整版的继承方式:
#include <iostream>
using namespace std;
class Person
{
public:
void Print()
{
cout << "name:" << _name << endl;
cout << "age:" << _age << endl;
}
protected:
string _name = "Tom"; // 姓名
int _age = 22; // 年龄
};
//这里的Student类和Teacher类继承了Person类,那么Student就享有了Person中的成员
//Person类叫为基类或父类
//Student类和Teacher类为派生类或子类
class Student : public Person
{
protected:
int _stuNo; // 学号
};
class Teacher :public Person
{
protected:
int _workNo;//工号
};
int main()
{
Student s;
Teacher t;
s.Print();
t.Print();
return 0;
}
在继承后父类Person的成员(成员函数与成员变量)都会变成子类的一部分,这里就体现出Student和Teacher复用了Person类,我们可以通过调试的监视窗口看到继承关系和调用父类成员。
继承定义
定义格式
这里的Person为基类/父类,Student和Teacher为派生类/子类,public则为继承方式。
继承方式
上图为继承关系和访问限定符
继承基类成员访问方式的变化
在继承当中,基类成员的访问方式有三种,权限设定大小为:public>protected>private
类成员/继承方式 | public继承 | protected继承 | private继承 |
---|---|---|---|
基类的public成员 | 派生类的public成员 | 派生类的protected成员 | 派生类的private成员 |
基类的protected成员 | 派生类的protecte成员 | 派生类的protected成员 | 派生类的private成员 |
基类的private成员 | 在派生类不可见 | 在派生类不可见 | 在派生类不可见 |
通过此表格我们可以知道基类给派生类的访问方式为,min(访问方式,继承方式),派生类的访问方式会变为基类的访问方式和继承方式取权限最小的那个。
代码辅助理解为:
#include <iostream>
using namespace std;
class Person
{
public:
void Print()
{
cout << "name:" << _name << endl;
cout << "age:" << _age << endl;
}
protected:
string _name = "Tom"; // 姓名
private:
int _age = 22; // 年龄
};
class Student : public Person
{
void fun()
{
Print();
_name = "王五";
_age = 20;
}
protected:
int _stuNo; // 学号
};
int main()
{
Student s;
return 0;
}
我们将Person类中的_age设置为私有成员,再通过继承Person的Student来修改_age的值,因为继承方式为public,所以基类的私有成员是不可以被访问的,所以我们修改私有成员会报错。
C++的继承方式有三种,实际上