C++中类的三种继承方式public(公有继承)、protected(保护继承)、private(私有继承)之间的差别(附思维导图)【转】

(转自:https://blog.csdn.net/coco56/article/details/80467975

注:若不指明继承方式,则默认是私有继承。

一:对于公有继承(public)方式:

  1. 基类的public和protected成员的访问属性在派生类中保持不变,但基类的private成员不可直接派生类中访问(可通过调用基类中访问属性为公有或保护的成员函数来访问基类中的私有成员)。即派生类中的成员函数可以直接访问基类中的public和protected成员,但不能直接访问基类的private成员。
  2. 基类成员对基类对象的可见性为:公有成员可见(或者说可访问),保护成员和私有成员不可见(或者说不可访问)。
  3. 基类成员对派生类的可见性为:基类的公有成员和保护成员可见,基类的私有成员不可见。
  4. 基类成员对派生类对象的可见性为:基类的公有成员可见,保护成员和私有成员不可见,即通过派生类的对象只能访问基类的public成员。
  5. 所以,在公有继承时,派生类的对象可以直接访问基类中的公有成员,派生类的成员函数可以直接访问基类中的公有成员和保护成员。

二:对于私有继承(private)方式:

  1. 基类的public和protected成员都以private身份出现在派生类中,但基类的private成员同样是不可直接访问的。
  2. 基类成员对基类对象的可见性为:公有成员可见,保护成员和私有成员不可见。
  3. 基类成员对派生类的可见性为:基类的公有成员和保护成员可见,基类的私有成员不可见。(经过私有继承之后,所有基类的成员都成为了派生类的私有成员或不可直接访问的成员,如果用此派生类进一步向下派生子类的话,基类的全部成员就无法在这个派生类的子类中被直接访问)
  4. 基类成员对派生类对象的可见性为:基类的公有成员、保护成员和私有成员均是不可见的,即通过通过派生类的对象不能直接访问基类中的任何成员。
  5. 所以,在私有继承时,派生类的对象无法直接访问基类中的任何成员,派生类的成员函数则依然可以直接访问基类中的公有成员和保护成员。另外,基类的公有和保护成员只能由直接派生类继承,而无法再向下继承。



三:对于保护继承(protected)方式

  1. 基类的public和protected成员都以protected身份出现在派生类中,基类的private成员也同样是不可直接访问的。
  2. 基类成员对基类对象的可见性为:公有成员可见,保护成员和私有成员不可见。
  3. 基类成员对派生类的可见性为:基类的公有成员和保护成员可见,基类的私有成员不可见。(比较私有继承和保护继承可以看出,实际上在直接派生类中,所有成员的访问属性都是完全相同的。但是,如果派生类作为新的基类继续派生时,二者的区别就出现了。)
  4. 基类成员对派生类对象的可见性为:基类的公有成员、保护成员和私有成员均是不可见的,即通过通过派生类的对象不能直接访问基类中的任何成员。
  5. 因此,保护继承既与私有继承有相似的地方也有与公有继承相似的地方。对派生类的对象来说,它与私有继承方式的性质相同。而对于其派生类来说,它又与公有继承方式的性质相同。这样做既实现了数据隐藏,又方便继承,实现代码重用。

猜你喜欢

转载自blog.csdn.net/biqioso/article/details/83108532