什么是继承?
继承机制是提高代码复用率的最重要手段,它可以在保持原有类的基础上进行扩展,增加功能。这样产生的类叫派生类(也叫子类)
取个例子:例如手机的更新换代
怎么使用继承?
要注意类的访问权限和继承权限的区别使用,访问权限在类中使用。
下面给出继承后派生类成员变量的访问权限变化
关于上表总结:
不管什么继承方式,基类private成员在派生类中是不能被访问的。因为基类和派生类是两个不同的类,两者作用域不同,而类的私有成员变量在类外不能访问。
public继承是一个接口继承,保持is-a原则,每个父类可用的成员对子类也可用,因为每个子类对象也都是一个父类对象。
如果基类成员不想在类外被访问,但需要在派生类中能访问,就定义为protected由此可看出保护成员限定符是因为继承才出现的
使用关键字class时默认的继承方式是private,使用关键字struct时默认的继承方式是public;最好能显式的给出继承方式
派生类对象的构造与析构
继承体系下先调用派生类的构造函数,再调用基类构造函数
继承体系下先执行基类的构造函数,再执行派生类构造函数
继承体系下先调用派生类的析构函数,再调用基类析构函数
基类没有定义构造函数,派生类也可以不用定义构造函数,全都使用缺省的构造函数。
基类有不是缺省的构造函数,派生类必须要在初始化列表中显式给出基类名和参数列表。
因为不显式定义的话,编译器不知道给基类构造函数传什么参数
基类和派生类的同名成员问题
在基类和派生类中有同名成员,通过派生类对象访问同名成员则优先访问派生类
在派生类成员函数中可以使用 基类::基类成员 访问
赋值兼容规则
子类对象可以赋值给父类对象(因为子类对象可以看成父类对象)
父类对象不能赋值给子类对象(会发生访问越界)
父类的指针或引用可以指向子类对象(多态的实现)
子类的指针或引用不能指向父类对象(可以通过强制类型转换完成)