【转】 派生类不同的继承方式

派生类继承和吸收了基类的全部数据成员和除了构造函数、析构函数之外的全部函数成员,但这些成员在派生类中的访问属性是可以调整的,这是由派生类定义格式中的继承方式来决定的,也就是继承方式控制了基类中具有不同访问属性的成员在派生类中的访问属性。

由于继承方式可以有publicprivateprotected三种,不同的继承方式会导致原来具有不同访问属性的基类成员在派生类中的访问属性也有所不同。这种访问包括两个方面:一是派生类中新增成员对从基类继承来的成员的访问;二是派生类的外部通过派生类的对象从基类继承来的成员的访问。

1)公有继承

当类的继承方式为公有继承时,基类中publicprotected成员的访问属性在派生类中不变,而基类private成员不可访问。也就是说,基类的publicprotected成员在公有继承方式下分别继承为派生类的publicprotected成员,派生类中的其他成员可以直接访问它们,在派生类的外部只能通过派生类的对象访问从基类继承来的public成员。而无论是派生类的成员还是派生类的对象都无法访问从基类继承来的private成员。

    所以,在公有继承时,派生类的对象可以访问基类中的公有成员;派生类的成员函数可以访问基类中的公有成员和保护成员。

2)私有继承

当类的继承方式为私有继承时,基类中的publicprotected成员都以private成员出现在派生类中,而基类private成员不可访问。也就是说,基类的publicprotected成员在私有继承方式下被继承为派生类的private成员,派生类中的其他成员可以直接访问它们,但在派生类的外部无法通过派生类的对象访问它们。而无论是派生类的成员还是派生类的对象都无法访问从基类继承来的private成员。

可以看出,经过私有继承后,所有基类的成员都成为派生类的私有成员,如果进一步派生的话,基类的成员就无法在新的派生类中被访问。因此,经过私有继承后,基类的成员再也无法在以后的派生类中发挥作用,实际是相当于中止了基类功能的继续派生。

    所以,在私有继承时,基类的成员只能由直接派生类访问,而无法再往下继承。

3)保护方式

当类的继承方式为保护继承时,基类中的publicprotected成员都以protected成员出现在派生类中,而基类private成员不可访问。也就是说,基类的publicprotected成员在保护继承方式下被继承为派生类的protected成员,派生类中的其他成员可以直接访问它们,但在派生类的外部无法通过派生类的对象访问它们。而无论是派生类的成员还是派生类的对象都无法访问从基类继承来的private成员。

所以,在保护继承时,基类的成员也只能由直接派生类访问,而无法再往下继承。

比较私有继承和保护继承,可以看出实际上直接派生类中,所有成员的访问属性都是完全相同的。但是,如果派生类作为新的基类继续派生时,二者的区别就出现了。

上面内容部分转自博客 http://blog.chinaunix.net/uid-21411227-id-1826860.html

原文地址:https://www.cnblogs.com/liangweixin/p/5027210.html