《C++ Primer》派生類到基類轉換的可訪問性
沒想到書上的短短几句話,我竟研究了一個晚上,不多說了,請看派生類到基類轉換的可訪問規則:
訪問規則: 1.如果是 public 繼承,則使用者程式碼和後代類都可以使用派生類到基類的轉換。 2.如果類是使用 private 或 protected繼承派生的,則使用者程式碼(即派生類物件)不能將派生型別物件轉換為基類物件。 3.如果是 private 繼承,則從 private 繼承類派生的類不能轉換為基類。 4.如果是 protected 繼承,則後續派生類的成員可以轉換為基類型別。 5.無論是什麼派生訪問標號,派生類本身都可以訪問基類的 public 成員,因此,派生類本身的成員和友元總是可以訪問派生類到基類的轉換。 |
下面是我的驗證程式碼:
//p489 派生類到基類轉換的可訪問性
#include<iostream>
using namespace std;
class A{};
class B:public A{};
class C:protected A{};
class D:private A{};
class E:public B{};
class F:public C{};
class G:public D{};
int main(){
A *pb, *pc, *pd, *pe, *pf, *pg;
pb = new B; // 正確 public派生,可以轉換[*B ---> *A].
pc = new C; // 錯誤 protected派生,不可轉換[*C -\-> *A].
pd = new D; // 錯誤 private派生,不可轉換[*D -\-> *A].
pe = new E; // 正確 public派生的子類,可以轉換[*E ---> *A].
pf = new F; // 錯誤(按話的意思是正確,但VC編譯是錯誤)protected派生的子類.
pg = new G; // 錯誤 private派生的子類,不可轉換[*G -\-> *A].
return 0;
}
相關文章
- C++中類繼承public,protected和private關鍵字作用詳解及派生類的訪問許可權C++繼承訪問許可權
- 繼承 基類與派生類繼承
- C++派生類的拷貝構造C++
- 派生類
- C++,繼承,基類和派生類指標間賦值等知識C++繼承指標賦值
- 泛型類派生子類泛型
- C++物件切片探秘:派生類物件如何被‘切割’?C++物件
- 類的繼承和派生繼承
- 類的訪問控制
- 類轉json的基類實現JSON
- PHP 手冊 (類與物件) 學習筆記六:訪問控制(可見性)PHP物件筆記
- 不同包類的互相訪問
- 顧客類的派生(C#程式碼)C#
- C#中類的屬性訪問器--get和set分析C#
- Java訪問類變數Java變數
- java工具類之編碼轉換工具類Java
- 子類擁有父類物件所有的屬性和方法,但無法訪問物件
- Cacheable 類轉換異常
- 型別轉換工具類型別
- 資料類新轉換
- LocalDateTime工具類(常用轉換)LDA
- WPF 控制元件類派生關係控制元件
- 進位制轉換的工具類
- 區分:派生類指定基類建構函式、繼承構造、委託構造函式繼承
- c++中string類物件和字元陣列之間的相互轉換C++物件字元陣列
- 如何提高網站的可訪問性?網站
- 【C++ Primer Plus】學習筆記--第10章 物件和類C++筆記物件
- TypeScript 類訪問修飾符TypeScript
- Dubbo剖析-服務提供方實現類到Invoker的轉換
- C++ 派生類函式過載與虛擬函式繼承詳解C++函式繼承
- C#中JSON轉換類C#JSON
- C#訪問或修改私有類、函式、變數、屬性C#函式變數
- Java類的設計和封裝及類成員的訪問控制Java封裝
- 類&成員可見性&繼承繼承
- c++類迴圈依賴的問題C++
- 在其他程式集訪問internal類
- C++中的抽象基類(Abstract Base Class)C++抽象
- c++模板類的使用,編譯的問題C++編譯
- HTML元素的分類,特性以及相互轉換HTML