派生類向基類到轉換是否可訪問由使用該轉換到**決定,同時派生類到派生訪問說明符也會有影響。假定d繼承自b:
上買的定義是摘自c++primer 裡面的定義,聽起來是不是很繞口,所以下面就結合**通俗的解釋下:
先看第一問吧,是什麼意思,定義三個類如下
#include #define _cout(str) std::cout}
也就是說a 的派生類c無法轉換為a因為c是私有繼承a 的,而b向a 的轉換成功了,沒有什麼問題,至於為什麼a要用指標那就是虛函式的問題了,詳情看其他文章吧,這裡就不多說了。
接下來是第二問:
不論d以什麼方式繼承b,d的成員函式和友員函式都能使用派生類向基類的轉換;派生類向其直接基類的型別轉換對於派生類的成員和友員而言永遠是可訪問的。 這裡就在定義四個類 分別繼承b(d只是代表,**中就不嚴格根據了,同時,為了方便起見,函式的定義全部放在類的內部,自動內聯-0-)
class b;
class d:public b
friend void friendfunction(d &d)
};class e:protected b
friend void friendfunction(e &e)
};class f:private b
friend void friendfunction(f &f)
};
大家可以講**拷貝到編譯器之中,發現都沒有報錯,看了**也應該理解第二句話的意思了。
最後是第三句話:
如果d繼承b 的方式是公有的或者受保護的,則d的派生類的成員和友員可以使用d向b 的型別轉換;反之,如果d繼承b 的方式時私有的,則不能使用。這句話咋一看和第二句沒什麼區別....可一定注意!!是d的派生類。
class d:public b
friend void friendfunction(d &d)
};class e:protected b
friend void friendfunction(e &e)
};class f:private b
friend void friendfunction(f &f)
};class g : d
};class h : e
};class i : f
friend void friendfunction2(f &f)
};
上述def分別公有、保護、私有繼承b,而 ghi 分別繼承def。可見只有i報錯,因此可得出結論三。 c 派生類向基類轉換的可訪問性
1.成員函式和友元函式 友元類的許可權是一樣一樣一樣一樣的,是最高的許可權,private protected public成員都可以隨意訪問。2.使用者 類外呼叫的其他 許可權是最低的,只有類的public成員才能訪問 不考慮靜態成員 protected private都無法訪問。3.繼承體系,如...
C 筆記 派生類到基類轉換到可訪問性
使用者 指的是除友元函式,成員函式之外的 後代類,不僅僅指第一級派生類,還包括間接派生自基類的後續的派生類。派生類,這裡專指 直接繼承類。include using namespace std class a class b public a class c protected a class d ...
C 筆記 派生類到基類轉換到可訪問性
c 筆記 派生類到基類轉換到可訪問性 要確定到基類的轉換是否可訪問,可以考慮基類的public成員是否可訪問,如果可以,轉換是可以訪問的,否則,轉換是不可訪問的。如果是public繼承,則使用者 和後代類都可以使用派生類到基類的轉換。如果類是使用private或protected繼承派生的,則使用者...