C 類的繼承

2021-10-19 09:35:39 字數 2262 閱讀 5868

c++的繼承,說到底就是使用父類(基類)來完成某一樣事情嘛…

換一種說法,繼承就是為了復用父類的方法。

繼承之後,父類的public成員相當於變成子類的public成員,能在外部直接使用;而父類的protected成員變成子類的protected成員;父類的private成員卻不能通過子類來訪問。

繼承之後,父類的public和protected成員變成子類的protected的成員;父類的private成員依舊不能通過子類來訪問。

這個時候,父類的public、protected成員變成子類的private成員;這個時候,父類的private成員依舊不能通過子類來訪問。

因為父類的有些東西不能與子類共有,或者不能被繼承。比如,父親的年齡被定義在private,兒子繼承父親的年齡能幹嘛?這個屬性是父親特有的私有的。

呼叫子類的。

構造時候,先子類後父類;析構時候,先父類後子類。遵循棧規則,即先進先後,後進先出。

需要在子類的建構函式中顯式呼叫,比如dog():animal("zhou")

//外部定義的建構函式

dog::

dog(

int myage)

:animal

("zhou"),

age(myage)

//類中的宣告

class

dog:

public animal

;

外部定義時候,可以給父類建構函式傳參,同時也可以初始化子類的屬性。編譯器可以區別出不同的符號,因為animal這個符號是class定義時候繼承而來。

在類的宣告中,建構函式不需要帶初始列表,不然會報錯。

void dog::

test()

子類繼承父類,本質是子類例項化的時候,在開闢一片空間儲存父類,所以,父類的同名函式也儲存下來。

在子類中,直接呼叫的函式優先呼叫自身類中的成員函式,因為呼叫1,實際是呼叫2。而3 是從作用域的角度來呼叫函式。利用這個特點,我們可以呼叫父類的同名函式。

這是c++的隱藏規則在作怪。直接呼叫 1 ,其實隱藏了很多細節;而使用作用域的方式呼叫,可以繞過這些隱藏規則。

可以,這相當於子類物件可以無條件地隱式型別轉換為父類物件。不過父類指標物件只能呼叫子類中繼承父類的那一部分方法,子類自身的方法不能被呼叫,這規則也適用於子類和父類同名的函式。

比如圓和橢圓的問題,是圓繼承橢圓,還是橢圓繼承圓?不論誰繼承誰,都很不妥,比如,圓有半徑,而橢圓有長軸和短軸,這些屬性在另乙個類中都用不上。雖然類的有些方法有些方法被復用,但是是硬是要繼承,還是造成不良的繼承。歸根到底,這兩者不具備傳遞性。

就是乙個class內使用其它多個class的物件作為成員。類似於乙個結構體,包含了其它的結構體。

比如,定義乙個人,人有兩隻腳,我們可以這樣定義:

class

leg;

class

person

;

在oo設計原則中,優先選擇組合的方式,然後才是繼承。但也有缺點,它會令系統的物件增多。

第一種二義性:父類的有同名的函式

classa;

};classb;

};classc:

public a,

public b

;

int

main()

這種情況下,c1呼叫hello()會產生歧義,不知道呼叫a的,還是b的hello().

解決的方法:顯式指定呼叫的物件。c1.a::hello();

第二種二義性:菱形繼承問題,使用虛函式來解決

什麼是菱形繼承問題?就是孫子類c中繼承了b1和b2,而b1和b2同時繼承了相同的乙個父類a,這樣就導致孫子類有兩份a。

解決方案是讓b1和b2虛繼承a,c再正常多繼承b1和b2即可.

原理解釋:

虛函式是在程式執行時候才去鏈結執行,從而實現多型。

類中帶有純虛函式,那麼這個類就是抽象類。抽象類不能被例項化。

抽象類是為了讓語法和語義保持一致。比如,父類animal 和 子類cat。我們知道,動物可以吃食物,可以叫,但是具體怎麼吃,怎麼叫,我們不知道,為了保持語法和語義的一致性,我們把吃和叫的方法現在父類中宣告為純虛函式。而子類cat就可以具體實現吃和叫的方法。

還有乙個作用,就是讓程式設計師檢視父類,就知道animal大概有什麼方法了可以使用,否則,需要檢視相應的子類。

C 類的繼承

繼承是物件導向程式設計的主要特徵之一,它可以讓你重用 可以節省程式設計的時間。1.object類的作用。object object為別名 是所有類的基類,在c 中所有的類都直接或間接繼承於object,如果在乙個類的宣告中沒有指定它繼承於哪個類則是繼承於object類。2.類繼承的實現。以下定義兩個...

C 類的繼承

複習下c 類的繼承,先看下面例子 class a public可以在類內部 派生類 類的例項訪問 protected void test2 protected可以在類內部 派生類訪問 private int m a m a為private,只能在本類使用 class b public a class...

c 類的繼承

類的繼承有三種方式 1 公有繼承 2 私有繼承3 保護繼承 基類中的私有成員在派生類中時隱藏的,只能在基類中訪問 派生類中的成員不能訪問基類中的私有成員,但是可以訪問基類中的公有成員和保護成員。派生類從基類公有繼承時,基類的公有成員和保護成員仍然是派生類中的公有成員和保護成員 私有繼承時,公有成員和...