《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++派生類物件訪問基類的protected成員C++物件
- 基類與派生類的轉換
- c# 基類派生類成員方法訪問C#
- C++中類繼承public,protected和private關鍵字作用詳解及派生類的訪問許可權C++繼承訪問許可權
- 繼承 基類與派生類繼承
- [C++]繼承和派生類C++繼承
- C# 繼承 子類(派生類) 父類(基類)C#繼承
- C++派生類的拷貝構造C++
- C++,繼承,基類和派生類指標間賦值等知識C++繼承指標賦值
- YTU-OJ-Problem J: B3 指向基類的指標訪問派生類的成員函式指標函式
- c#之基類派生類base_小記C#
- 泛型類派生子類泛型
- c#之基類派生類base_小記(2)C#
- 父類和子類之間的轉換問題
- C++物件切片探秘:派生類物件如何被‘切割’?C++物件
- C++隱式類型別轉換C++型別
- C++ 隱式類型別轉換C++型別
- C#基礎概念之密封類,屬性訪問器,介面C#
- 救命,關於類轉換問題
- TreeView 的派生類: TreeViewEx 實現 NodeShowToolTip、NodeDoubleClick 事件 (轉)View事件
- Python的類例項屬性訪問規則Python
- PHP 手冊 (類與物件) 學習筆記六:訪問控制(可見性)PHP物件筆記
- C++中類及類的定義 (轉)C++
- 基於HttpClient實現Http訪問工具類HTTPclient
- 類的轉換函式函式
- 顧客類的派生(C#程式碼)C#
- 類轉json的基類實現JSON
- C#中類的屬性訪問器--get和set分析C#
- c#繼承父子類成員間的互訪問性C#繼承
- Date轉換工具類
- Java訪問類變數Java變數
- C/C++—— 除了用類成員函式訪問類私有成員變數外,還可以通過類物件地址來直接訪問和修改類的私有成員變數C++函式變數物件
- 子類擁有父類物件所有的屬性和方法,但無法訪問物件
- 漫談QWidget及其派生類(二)
- Java中類的成員方法和變數的訪問許可權Java變數訪問許可權
- CDC的四個派生類CClientDC,CPaintDC,CWindowDC,CMetaFileDclientAI
- 洗牌的一個C++類! (轉)C++
- 匿名內部類訪問final區域性變數變數