目录
前言
hello,小伙伴们大家好。相信对面向对象有一定了解的小伙伴都知道面向对象的三大特性为封装、继承、多态。封装特性我们已经在类和对象中体验到了,那么今天我们就来接着学习面向对象的继承特性。
一、继承的概念与定义
1、继承的概念
继承是面向对象程序设计的重要代码复用手段,它允许我们在保持原有类特性的基础上进行扩展,形成新的类,叫做派生类。继承体现了面向对象程序设计的层次结构。我们以前接触的都是函数复用,而继承是类的复用。
2、继承的定义
2.1定义格式
下面我们看到的Person是父类,也称为基类。Student是子类,也成为派生类。
继承后父类的Person成员(成员变量和成员函数)都会成为Student的一部分。
class Person
{
public:
void Print()
{
cout << "name:" << _name << endl;
cout << "age:" << _age << endl;
}
protected:
string _name = "peter"; // 姓名
int _age = 18; // 年龄
};
class Student : public Person
{
protected:
int _stuid; // 学号
};
2.2继承关系和访问限定符
继承基类成员访问方式的变化:
类成员/继承方式 | public继承 | protected继承 | private继承 |
基类的public成员 | 派生类的public成员 | 派生类的protected成员 | 派生类的private成员 |
基类的protected成员 | 派生类的protected成员 | 派生类的protected成员 | 派生类的private成员 |
基类的private成员 | 在派生类中不可见 | 在派生类中不可见 | 在派生类中不可见 |
总结:
(1)当基类是private成员时,不论是什么继承,在派生类中都不可见。这里的不可见是指基类的私有成员虽然继承到了派生类当中,但由于语法的限制派生类对象不管在类里面还是在类外面都不能去访问它。
(2)如果想要基类成员不能在类外面被访问,但可以在派生类中被访问,可以把成员定义为protected。可以看出,protected这个概念就是专门为继承而生的。
(3)从上面的表格可以总结出,private成员在派生类中都不可见。而其它成员都适合派生类做对比,取最小权限做派生类的访问方式。
(4)使用关键字class默认的继承方式是private,使用关键字struct默认的继承方式是public,但一般最好写清楚继承方式。
(5)在实际运用中一般使用都是public继承,几乎很少使用protetced/private继承,也不提倡使用protetced/private继承,因为protetced/private继承下来的成员都只能在派生类的类里面使用,实际中扩展维护性不强。