1. 程式人生 > >C++中類的三種繼承方式public(公有繼承)、protected(保護繼承)、private(私有繼承)之間的差別(附思維導圖)【轉】

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. 因此,保護繼承既與私有繼承有相似的地方也有與公有繼承相似的地方。對派生類的物件來說,它與私有繼承方式的性質相同。而對於其派生類來說,它又與公有繼承方式的性質相同。這樣做既實現了資料隱藏,又方便繼承,實現程式碼重用。