C 類的繼承性

2021-10-06 02:04:18 字數 3437 閱讀 5768

private,    //私有成員,只能由類內部成員訪問  //(預設屬性)    //也是類封裝性的體現

public,     //共有成員,類內成員或類物件都能訪問

protected  //保護成員,類內成員或者繼承類訪問。

一般使用方式:類成員變數使用private;類成員函式使用public;而protected是在類繼承中才會使用。(不繼承的話,protected相當於private,也就是說,有些私有成員我們平時是當成私有成員,當有子類的時候,我們想讓子類繼承。)

類可以是單繼承(繼承於乙個父類)和多繼承 (繼承於多個父類)   

三種繼承方式與成員屬性相同,

public,//公有繼承

private//私有繼承

protected//保護繼承

子類繼承方式

父類成員屬性

繼承結果及父類成員

在子類中屬性

備註public

public

子類可以訪問,

屬性仍為public

public

private

子類不可以訪問

屬性仍為private

public

protected

子類可以訪問,

屬性仍為protected

這個就是protected

屬性的意義

private

public

子類可以訪問

屬性變為private

private

private

子類不可以訪問

屬性仍為private

private

protected

子類可以訪問

屬性變為private

protected

public

子類可以訪問

屬性變為protected

protected

private

子類不可以訪問

屬性仍為private

protected

protected

子類可以訪問

屬性仍為protected

說明:1)我們一般使用的是public繼承,其他兩種繼承方式可以暫時不管。

2)父類成員屬性為private的,子類無論以何種方式繼承,都無法訪問的。

3)父類成員被子類繼承後的屬性,此時的屬性可用性就可以參照1中的情況來分析了。

類宣告中如下形式

class  a : public class b

1)子類繼承了除父類的建構函式、析構函式外的所有成員變數和成員函式;

2)子類可以擁有新的成員變數和成員函式。

3)父類成員函式為virtual時,子類可以重寫該函式

4)父類成員函式不為virtual時,子類重新定義該函式時,會覆蓋父類函式。

父類成員函式為virtual時,子類可以重寫該函式,注意函式名,引數必須完全一樣。否則即便是父類成員函式前有virtual也沒用,不是重寫,變成重定義了。

虛方法只有在使用指標或引用來呼叫函式的時候才會用到(指標/引用是基類指標/引用)

用物件來呼叫函式的時候,不會用到虛方法。

基類方法的宣告中使用virtual可使該方法在基類及所有派生類(包括從派生類派生出的類)中是虛的。

重寫函式的訪問修飾符可以不同。即,假使virtual是private的,派生類中重寫改寫為public,protected也是可以的

假使方法是通過引用型別或指標型別選擇方法:

1)當父類成員函式不是virtual時,程式會根據引用或指標型別來選擇方法版本。

2)當父類成員函式前面有vitual, 程式將根據引用或指標指向的物件的型別來選擇方法。

class cbase 

public:

void length(string str)

void length(int num)

};class cderive:public cbase //重寫,因基類中width()為虛函式

void lenth(int num) //重定義,lenth函式在父類中不為虛函式

void length(int a,int b) //重定義,lenth函式在父類中不為虛函式

};int main()

6、子類重定義父類函式//一般不這麼用//可以忽略不看

重定義 (redefining)也叫做隱藏:子類重新定義父類中有相同名稱的非虛函式( 引數列表可以不同 ) 。

如果乙個類,存在和父類相同的函式,那麼,這個類將會覆蓋其父類的方法,除非你在呼叫的時候,強制轉換為父類型別,否則試圖對子類和父類做類似過載的呼叫是不能成功的。

該指標只能訪問父類定義的函式,(靜態聯編)(與父類指標,指向父類物件一樣的效果)

這是我們經常用到的,這也是虛函式的作用所在。即多型性的體現。同乙個類中,函式名相同,函式引數不同,構成多型;基類繼承類中,函式名、函式引數完全相同,通過基類指標指向的物件不同,也實現了多型性。

//同時將不同的資料型別放在乙個陣列是不可能的(比如將cbase和cderive物件放在一起是不行的,

但是,可以將cbase*指標放在同一陣列內,)

int main()

; for(int i =0;i<2;i++)

}

下圖中展示了為什麼基類指標/引用可以指向派生類物件的情況,而反之不行(除非顯示強制轉換)

8、子類指標指向父類物件//一般不這麼定義//可以忽略不看

需要先進行強制型別轉換(explicit cast);

1)將派生類引用或指標轉換為基類引用或指標稱為向上強制轉換,這個不需要強制轉換;派生類物件都是基類物件,繼承了基類的所有資料成員和成員函式,所以對基類物件的任何操作,都適用於派生類物件。

2)相反的過程,將基類指標或醫用轉換為派生類指標或引用稱為向下強制轉換,如果不使用顯示型別轉換,向下強制轉換是不允許的。

3)按值進行傳遞,只能將派生類中的基類部分傳到函式中

一般用法:

1)基類中需要繼承類重寫的函式前面應新增virtual

2)基類中析構函式前新增virtual

3)使用基類指標或引用指向基類物件或派生類物件實現動態連編

4)派生類直接值傳遞給基類,仍然呼叫的是基類的函式,是靜態連編。

C 中的可繼承性

與c語言另乙個不同點就是c 具有可繼承性,這也是c 的一大優勢。繼承關係主要存在於類與類之間,繼承的類稱之為子類 派生類 被繼承的類稱之為父類 基類 繼承關係中,子類無條件擁有父類中的所有屬性和方法。繼承的寫法用 表示,一般地,繼承方式為public形式,具體地寫法如下面的例子 include us...

css的繼承性

一 css的繼承性 1 文字屬性 屬性 說明vertical align 垂直文字對齊 text decoration 規定新增到文字的裝飾 text shadow 文字陰影效果 white space 空白符的處理 unicode bidi 設定文字的方向 2 盒子模型的屬性 屬性 說明width...

CSS的繼承性

css的某些樣式是具有繼承性的,那麼什麼是繼承呢?繼承是一種規則,它允許樣式不僅應用於某個特定 html 標籤元素,而且應用於其後代。所有的css語句都是基於各個標籤的繼承關係的。但是並不是所有的屬性都能被繼承,一般的字型屬性都是能繼承的,不能繼承的例如邊框屬性 注意 孩子能繼承父親屬性,但是父親不...