《C++ Primer》派生類到基類轉換的可訪問性

GeekWay發表於2012-08-31

沒想到書上的短短几句話,我竟研究了一個晚上,不多說了,請看派生類到基類轉換的可訪問規則:

訪問規則:
1.如果是 
public 繼承,則使用者程式碼和後代類都可以使用派生類到基類的轉換。
2.如果類是使用 
private  protected繼承派生的,則使用者程式碼(即派生類物件)不能將派生型別物件轉換為基類物件。
3.如果是 
private 繼承,則從 private 繼承類派生的類不能轉換為基類。
4.如果是 
protected
 繼承,則後續派生類的成員可以轉換為基類型別。

5.無論是什麼派生訪問標號,派生類本身都可以訪問基類的 public 成員,因此,派生類本身的成員和友元總是可以訪問派生類到基類的轉換。

我的疑惑在第4條,我發現在VC6.0下和C-Free下都不能驗證該條件成立,如果大家有好的見解,請告訴我,謝謝!

下面是我的驗證程式碼:
//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; 
}




相關文章