C 類的繼承 訪問許可權 虛繼承

2021-08-16 18:20:01 字數 2238 閱讀 6392

今天突然發現自己關於類的繼承,虛基類,訪問許可權混在在一起的時候有有一些模糊,所以今天進行重新學習一下。如果錯誤或者不對的地方,還請指教。

一、類的繼承方式

類有三種成員成員,private,protected,public,

基類的成員

派生方式

子類訪問特性

public

protected

private

public

public

protected

no access

public

protected

private

protected

protected

protected

no access

public

protected

private

private

private

private

no access

我們在看一下類對三種成員的訪問:

類的成員訪問許可權

public

protected

private

訪問特性

類的成員函式、類的成員變數,都可以通過類的成員函式或類的例項化進行訪問

可以被類的成員函式進行訪問,子類的函式,友元函式進行訪問。

成員函式、成員變數不能被類的例項化進行訪問,只能被類的成員函式訪問,友元函式訪問

在理解派生的時候只要抓住兩點:①找出這個成員函式在基類中的訪問許可權,和子類的繼承方式 ②對應找出繼承的成員在子類中的訪問許可權是什麼,然後在只看這個繼承而來的。對於任何類,它裡面就存在三種方式public、protected、private,

我們只要知道能夠抓住某個成員函式或者成員變數到底是屬於這三個中的哪乙個,我們不管他是怎麼派生來的,無論那種派生,到子類中是private,就按照private的方式訪問,到子類是public就按照public進行訪問,

到不了子類就訪問不了

,有人就會問那protected和private的區別是什麼了,有的地方的解釋,在類外是一樣的,「類外」這個描述把有的初學者給搞暈了,protected和private都可以被類的

成員函式內

進行訪問,訪問的方式可以通過this->...還有友元訪問,但是區別就是private是到不了子類的,而protected是可以到子類的,這是為什麼很多部落格在寫這兩者的區別的時候,protected增加一條子類的訪問。

二、虛繼承、虛函式

類的物件在例項化的時候會呼叫建構函式,那麼子類的建構函式的呼叫順序是怎麼樣的,直接上**。

很明顯構造順序為:

class a

class b:public a

;class c:public a

;class d:public c,public d

;

如果d是例項化的時候訪問k,這個k到底是b繼承來的還是c繼承來的?  這就出現二義性,其實虛繼承就是為了解決這個二義性而產生的,為了只讓基類儲存乙個這樣的副本,就宣告為虛繼承,這樣就只是儲存了乙個副本。

虛函式又是這麼回事?   這篇文章和清晰的講解了虛函式的繼承,覆蓋並從記憶體面解釋虛表,其中  一般繼承(有虛函式的覆蓋),基類的例項a和子類的例項b訪問就會根據虛表來進行呼叫。

說到虛函式肯定會講到純虛函式,①純虛函式沒有函式體  ②純虛函式的作用是在基類中留下乙個空間,以便派生類對他進行定義 ③ 如果子類沒有對基類的純虛函式進行實現,那麼這個函式任然是純虛函式,這個類任然是抽象類。

跟純虛函式相關又是抽象類,抽象類是不能被例項化的,純虛函式在派生類中實現後,派生類才能例項化出物件,作為一種基本型別用作繼承,凡是包含純虛函式的都是抽象類。

作者能力有限,如有錯誤,還請指出。

C 類繼承訪問許可權及外部訪問許可權

c 訪問許可權問題主要包括兩種 一種是外界對類成員的普通訪問,主要通過類內的public protected private許可權修飾符 另一種是繼承關係中子類對父類成員的訪問。基本原則 外界只能訪問類中public成員,子類可訪問父類的public和protected成員 不同繼承方式只影響外界 ...

類繼承 虛繼承

inheritclass.cpp created on 2016年7月18日 author zroad include include using namespace std class baseclass void f char s unkown protected void g char s u...

繼承訪問許可權

當子類繼承了某個類後,便可以使用父類中的成員變數,當並不是完全繼承父類的所有成員變數,具體原則如下 變數原則 1 能夠繼承父類的public和protected變數.不能夠繼承父類的private變數 package test1 class son public class a extends so...