複習 C 之類之間的關係

2021-09-12 22:15:04 字數 2510 閱讀 1209

類間的關係有很多種,在大的類別上可以分為兩種:縱向關係、橫向關係。

縱向關係就是繼承關係。

類的繼承,是新的類從已有類的那裡得到已有的特性。或從已有類產生新類的過程就是類的派生。原有的類稱為基類或父類,產生的新類稱為派生類或子類。

乙個派生類可以同時有多個基類,這種情況稱為多重繼承,派生類只有乙個基類,稱為單繼承。

繼承方式規定了如何訪問基類繼承的成員。繼承方式有public,private,protected。如果不給出繼承方式,預設為private繼承。繼承方式指定了派生類成員以及類外物件對於從基類繼承來的成員的訪問許可權。

public繼承,訪問修飾符沒有變化的。

protected繼承,訪問修飾符public成員變成protected成員。

private繼承,訪問修飾符public成員和protected成員變成private成員。

無論什麼繼承,private在子類中都不可訪問。

除了private成員,無論怎麼繼承在子類都能使用。

派生類繼承基類中除構造和析構函式以外的所有成員。

繼承關係中,要執行父類的指定的建構函式也需要在初始化列表中。

子類重寫父類的函式,名字和引數列表要與父類一樣。

當父類的指標指向乙個子類的物件時,能使用的只有父類的成員。

子類中由父類繼承而來的成員的初始化工作還是由父類的建構函式完成,然後子類中新增的成員在子類的建構函式中初始化。

建構函式的初始化順序根據宣告的順序初始化。

子類執行建構函式執行次序:呼叫父類建構函式,呼叫順序按照它們被繼承時宣告的順序(從左到右);呼叫內嵌成員物件的建構函式,呼叫順序按照它們在類中宣告的順序;子類的建構函式體中的內容。

子類的析構函式的功能是在該物件消亡之前進行一些必要的清理工作,析構函式沒有型別,也沒有引數。析構函式的執行順序與建構函式相反。

過載:指同一可訪問區內被宣告的幾個具有不同引數列(引數的型別,個數,順序不同)的同名函式,根據引數列表確定呼叫哪個函式,過載不關心函式返回型別。

隱藏:隱藏是指派生類的函式遮蔽了與其同名的基類函式。只要是同名函式,不管引數列表是否相同,基類函式都會被隱藏。

重寫:指派生類中存在重新定義的函式。其函式名,引數列表,返回值型別,所有都必須同基類中被重寫的函式一直。只有函式體不同,派生類呼叫時會呼叫派生類的重寫函式,不會呼叫被重寫函式。重寫的基類中被重寫的函式必須有virtual修飾。

過載和重寫的區別:

範圍區別:重寫和被重寫的函式在不同的類中,過載和被過載的函式在同一類中;

引數區別:引數區別:重寫與被重寫的函式引數列表一定相同,過載和被過載的函式引數列表一定不同;

virtual的區別:重寫的基類必須要有virtual修飾。

隱藏和重寫,過載的區別:

與過載範圍不同:隱藏函式和被隱藏函式在不同類中。

引數的區別:隱藏函式和被隱藏函式引數列表可以相同,也可以不同,但函式名一定相同。當引數不同時,無論基類中的函式是否被virtual修飾,基類函式都是被隱藏,而不是被重寫。

橫向關係比較微妙,按照uml的建議大體上可以分為四種:

1.依賴

2.關聯

3.聚合

4.組合

1.依賴:

所謂依賴就是某個物件的功能依賴於另外的某個物件,而被依賴的物件只是作為一種工具在使用,並不持有對它的引用。

例如,人需要空氣,乙個人自建立出來就需要不停的呼吸,而人的呼吸功能之所以能維持生命就在於吸進來的氣體發揮了作用,所以說空氣是人類的乙個工具,而人並不持有對它的引用。

2.關聯:平等的朋友關係

所謂關聯就是某個物件會長期的持有另乙個物件的引用,而二者的關聯往往也是相互的。關聯的兩個物件彼此間沒有任何強制性的約束,只要二者同意,可以隨時解除關係或是進行關聯,它們在生命期問題上沒有任何約定。被關聯的物件還可以再被別的物件關聯,所以關聯是可以共享的。

例如,人從生至死都在不斷交朋友,然而沒有理由認為朋友的生死與我的生死有必然的聯絡,所以他們的生命期沒有關聯,我的朋友又可以是別人的朋友,所以朋友可以共享。

3.聚和:所屬關係

聚和是強版本的關聯。它暗含著一種所屬關係以及生命期關係。被聚合的物件還可以再被別的物件關聯,所以被聚合物件是可以共享的。雖然是共享的,聚合代表的是一種更親密的關係。

例如,我和我的家之間具有著一種強烈的所屬關係,我的家是可以分享的,而這裡的分享又可以有兩種,一種是聚合間的分享,著正如你和你愛人都對這個家有著同樣強烈關聯;一種是聚合與關聯的分享,如果你的朋友來家裡吃個便飯,就是臨時的分享。

4.組合

組合是關係當中的最強版本,它直接要求包含物件對被包含物件的擁有以及包含物件與被包含物件生命期的關係。被包含的物件還可以再被別的物件關聯,所以被包含物件是可以共享的,然而絕不存在兩個物件對同乙個被包含物件的共享。

組合關係就是整體與部分的關係,部分屬於整體,整體不存在,部分一定不存在,然而部分不存在整體是可以存在的,說的明確一些就是部分必須創生於整體之後,而銷毀與整體銷毀之前。部分在這個生命期內可以被其他物件關聯甚至聚合,但有一點必須注意,一旦部分所屬於的整體銷毀了,那麼與之關聯的物件中的引用就會成為空引用,這一點可以利用程式來保障。

心臟的生命期與人的生命期是一致的,如果換個部分就不一定,比如闌尾。

C 之類和類之間的關係

繼承關係 實現 c 通過純虛函式和純虛類模擬乙個介面,抽象類是乙個介面類 定義乙個抽象類,下面對於抽象類進行實現 依賴 虛線 乙個類是另外乙個類的函式引數或者函式返回值 關聯 實線線條 乙個類是另乙個類的成員變數。乙個類是另外乙個類的函式引數或者函式返回值 張三借車去上班,void gowork c...

c 之類指標的關係

1基類指標和派生類指標與基類物件和派生類物件4種可能匹配 直接用基類指標引用基類物件 直接用派生類指標引用派生類物件 用基類指標引用乙個派生類物件 用派生類指標引用乙個基類物件。2.基類指標引用派生類物件 例如 a p 指向型別 a 的物件的指標 a a obj 型別 a 的物件 b b obj 型...

C 之類和物件的關係

例1 附例1 小問學程式設計 例 設計乙個圓類。屬性 圓心座標 半徑。操作 對圓的資訊進行讀取 設定以及列印,計算兩個圓之間的距離。類 circle物件 c1 c2 關係 類是物件的抽象型別 物件是類的具體例項 示例分析 類中定義成員時被private修飾的成員為類的私有成員,類外不可見。被publ...