一、继承概念及定义
1. 继承概念
继承是面向对象程序设计中使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生的新的类,称派生类,原有的类称为基类或者父类。
下面代码中student和teacher两个类都继承了person类,继承后,基类的成员函数和成员变量可以在子类中访问到。
2.继承定义
2.1 定义格式
下面我们看到Person是父类,也称作基类。Student是子类,也称作派生类。
2.2 继承关系和访问限定符
继承的方式有:公有、保护和私有三种,和类内部的访问限定符一样,所以组合后子类对基类成员访问的方式有九种。
1.基类private成员在派生类中无论以什么方式继承都是不可见的。这里的不可见是指基类的私有成员还是被继承到了派生类对象中,但是语法上限制派生类对象不管在类里面还是类外面都不能去访问它。
2.基类private成员在派生类中是不能被访问的,如果基类成员不想在类外直接被访问,但需要在派生类中能访问,就定义为protected。可以看出保护限定符是因继承才出现的。
3.实际上面的表格我们进行一下总结会发现,基类的私有成员在子类都是不可见的。积累的其他成员在子类中的访问方式==min(成员在基类的访问限定符,继承方式),public > protected > private。
4.使用关键字class时默认的继承方式是private,使用struct时默认的继承方式是public,不过最好显示的写出继承方式。
5.在实际运用中一般使用的都是public继承,几乎很少使用protected/private继承,也不推荐使用,因为这样继承下来的成员都只能在派生类的类里面使用,实际扩展维护性不强。
二、基类和派生类对象赋值转换
切片的过程不会产生临时变量,是一个天然的过程。
三、继承中的作用域
1.在继承体系中基类和派生类有独立的作用域。
2.当子类和父类中有名字相同的成员变量或函数时,子类会屏蔽父类对同名成员的直接访问,优先调用子类的同名成员,这种情况叫隐藏或重定义。
上面展示了成员变量名相同时的隐藏,下面时对成员函数的隐藏,只要函数名相同,无论其参数列表是否相同都会构成隐藏。此时参数列表不同,函数名相同并不会构成重载,构成重载函数的前提是必须在同一个作用域。