在子类继承父类的过程中,子类可以指定以何种方式继承父类:public继承、protected继承和private继承,这个过程可以称为“访问控制”。
在学习访问控制之前,需要知道类含有三种成员:public成员、protected成员、private成员。 在非继承的情况下,这三种成员的访问属性是不同的:public成员在类内部和外部均可被直接访问;protected和private成员均可以被类内部和类内部的类对象访问,均不能被类外部的类对象访问。为了便于自己记忆,称这个规则为“非继承时三种成员的访问法则”
此知识点的复杂性在于继承方式有三种,每种继承方式又对应三种成员,所以一共是九种情况。为此,采用表格形式记录如下:
上表中“子类吸收后”表示父类成员在子类中是何种身份(身份指:public或protected或private),也就是说不同的继承类型使得父类成员在子类中的身份不同。
比如,在protected继承类型中,父类中的public成员对应在子类中为protected成员,此时子类内部(指成员函数和子类对象)可以访问该protected成员,但是子类外部的子类对象无法访问该成员。也就是说,通过protected类型的继承,该成员从父类中的public成员变为子类中的protected成员。
下面是public继承的例子,其中父类为Animal,子类为Duck:
class
父类Animal中分别定义了public类型的eat()函数、protected类型的run()函数、private类型的showAge()函数。子类可以通过选择不同的继承方式,改变这几个函数在子类中的访问属性:
class
总结:
按照自己目前的理解,不管继承方式为public、protected和private三种中的哪一个,父类的private成员对应到子类中均“不可直接访问”。此外,子类不继承父类的构造函数和析构函数。
疑惑:
书中所说的“不可直接访问”,目前自己并不知道如何间接访问,猜测可能是采用 “get” 和 “set” 方式进行间接访问。