派生類(多級)到基類轉換的可訪問性

《C++primer》第四版 15.3.1節提到基類到派生類轉換(不管ref/poniter or not)的可行性,有些拗口,根據英文版翻譯,獲得如下幾個要點:函數

1.若是是 public 繼承,則用戶代碼和後代類均可以使用派生類到基類的轉換。測試

2.若是類是使用 private 或 protected繼承派生的,則用戶代碼(即派生類對象)不能將派生類型對象轉換爲基類對象。spa

3.若是是 private 繼承,則從 private 繼承類派生的孫類不能轉換爲基類。翻譯

4.若是是 protected 繼承,則從protected繼承派生的孫類的成員函數能夠轉換本類爲基類類型,可是不能想2那樣由用戶直接轉換。對象

5.不管是什麼派生訪問標號,派生類自己均可以訪問基類的 public 成員,所以,派生類自己的成員和友元老是能夠訪問派生類到基類的轉換。繼承

 

按照我的理解,從新概括爲一下:it

 首先假定基類a成員都是public的class

(1)若是是public繼承,那麼若是類b是public繼承基類a派生的時,則用戶代碼(對類的操做)和後代類(應該理解爲派生類b的派生類c,一樣也是public繼承派生)均可以使用派生類到基類的轉換。程序

(2)若是類是使用private或protected繼承派生的,則用戶代碼(對類的操做)不能將派生類型對象(類b的實例)轉換爲基類對象(類a的實例)(由於基類a都是public類型的,而派生以後只能是private或者protected的,顯然是不能夠轉換的)。im

(3)若是是private繼承,則從private繼承類(此時基類在派生類b中的成員都是private類型的)派生的類(這個類c將會不可訪問b中基類a中的成員,由於此時基類a中的成員在類b已經都是private的,類c不會繼承類a的任何成員了)不能轉換爲基類。

(4)若是是protected繼承,則後續派生類(類b的派生類c)的成員(成員函數,藉助自身成員函數實現)能夠轉換爲基類類型(類a)(由於protected繼承,天然派生類能夠對基類成員進行訪問的,派生類中天然繼承基類中的成員,只是訪問限制改成了protected)(!!!若是直接對類c轉換成類a,是不能夠的!!!見(2))。  

 

有時間再寫程序測試一下~