C 中有關類的繼承的學習

2021-10-14 11:57:58 字數 2854 閱讀 6551

​ 1.當面臨乙個問題時,現在的類是否能解決部分問題,如果可以則把現在的繼承然後再進行拓展,來縮短解決問題的時間、降低解決問題的難度(繼承使用了**復用)

​ 2.當面臨的問題比較複雜時,可以把問題分層,每層設計乙個類,然後再通過繼承進行彙總,最終得到乙個可以解決問題的類,以此降低解決問題的難度

​ 乙個類可以繼承多個類,被繼承的類叫父類(基類),繼承者叫子類(派生類),每個父類都可以有不同的繼承方式

class 子類:繼承方式1 父類1,繼承方式2 父類2…

​ public 公有繼承

​ private 私有繼承

​ protected 保護繼承

​ 1.子類會繼承父類的所有成員無**有的、私有的、保護的,統統繼承

​ 2.父子類的轉換:

​ 子類可以安全的轉換成父類,也就是子類的指標或引用可以隱式轉換成父類的指標或引用,這是一種縮小的轉換,對於編譯器來說是安全的(父類指標指向子類)

​ 父類不可以轉換成子類,也就是父類的指標或引用不可以轉換成子類的指標或引用,這是一種型別擴大,在編譯看來這是一種危險操作(使用子類指標指向父類物件)

​ 編譯器僅僅是檢查指標或引用的資料型別,而對實現的引用目標並不關心(構成多型的基礎)

​ 3.子類會隱藏父類的同名成員

​ 1.可以通過域限定符訪問父類中的隱藏成員

物件.父名::成員,指標->父類::成員
​ 2.把子類物件轉換成父類,然後再訪問父類中的成員

​ 4.雖然子類繼承了父類中的所有成員,但在子類中不能訪問父類中的私有成員

限定符類內

子類類外

友元public

okok

okok

protected

okok

nook

private

okno

nook

父類中許可權

以public繼承在子類中

以protected繼承在子類中

以private繼承在子類中

public

public

protected

private

protected

protected

protected

private

private

private

private

private

注意:​ 在子類中是否能訪問取決於成員在父類中是什麼許可權,而在子類中變成了什麼許可權取決於以什麼方式繼承

​ 如果以protected或private方式繼承父類,那麼編譯器將禁止父類指標或引用指向子類物件,也就是說如果想實現多型必須以public方式繼承

​ 1.當建立乙個子類物件時,子類會按照繼承表的繼承順序呼叫父類的建構函式,預設情況下呼叫的是父類的無參構造,也可以在子類建構函式的初始化列表顯式呼叫有參構造

​ 2.當子類的析構函式執行完成後,會根據繼承表的逆順序呼叫父類的析構函式,但如果是使用父類的指標指向子類物件時,使用delete釋放會只呼叫父類的析構函式(可能會造成子類中的資源沒有釋放、資料沒有儲存)

​ 3.當使用舊的物件初始化新的物件時,會自動呼叫子類的拷貝建構函式,並且會先呼叫父類的無參構造,如果想呼叫父類的拷貝構造,需要在初始化列表中顯式呼叫

​ 4.當子類的賦值函式執行時,並不會自動呼叫父類賦值函式,需要在子類的賦值函式中顯式呼叫。

​ 父類::operator=(子類物件);

​ 當乙個類繼承多個父類時,會按照繼承表中的順序排列父類,子類會標記每個父類的位置,當子類指標隱式轉換成父類指標時,編譯器會自動計算父類在子類中的位,位址會自動進行偏移

​ 假設有乙個類a,類b繼承類a,類c繼承類a,類d繼承類b和類c,也就是類d的父類有個共同的祖先,這種繼承叫鑽石繼承。

注意:​ 這種繼承並不出錯,且不能直接訪問祖先中的成員,因為祖先中的成員在父類各有乙份,在子類就匯合了,如果直接訪問祖先中的成員編譯器無法區別是那個父類中的,因此需要使用域限定符,重點是這種方式會造成冗餘

​ 當進行鑽石繼承時,祖先類中的內容會有冗餘,而使用虛繼承後,只儲存乙份祖先類的內容,這樣就避免了冗餘

​ 一旦進行了虛繼承,祖先類的建構函式只呼叫一次,而且是在子孫類中直接呼叫,同理析構、拷貝、賦值等一樣。

​ 類的成員函式前加virtual這種函式叫虛函式。

​ 子類中的函式可以覆蓋父類的虛函式(滿足條件),一旦覆蓋,子類中將不存在父類的虛函式(被覆蓋)

​ 當子類的覆蓋了父類中的虛函式,當通過父類的指標或引用呼叫虛函式時,它可能呼叫虛函式也可能呼叫子類中的函式,這種情況較多型

注意:​ 這種類的多型是在執行時才能確定具體呼叫哪個函式,所以這種多型也叫執行時多型

​ 1.必須發生在父子類之間

​ 2.父類中的函式必須是虛函式

​ 3.函式名和引數列表必須相同

​ 4.函式的返回值型別相同,或者是子類函式返回的返回值可以向父類中虛函式返回值做隱式轉換且有繼承關係

​ 5.訪問許可權可以不同

​ 1.父子類之間必須有覆蓋關係

​ 2.子類繼承父類時必須是以public方式繼承

​ 3.通過父類指標或引用呼叫虛函式

​ 函式過載:相同作用域下的同名函式引數列表不同構成過載關係

​ 函式隱藏:不同作用域下且具有包含關係的同名函式構成隱藏關係

​ 覆蓋:父子類之間的同名函式,父類函式為虛函式,子類函式滿足一系列條件,構成覆蓋條件。

​ 當建立子類時,子類會先呼叫父類的建構函式,在父類的建構函式中如果呼叫虛函式,由於此時還沒有構件好子類物件(也就是還沒有完成覆蓋),因此只能呼叫父類的虛函式。

​ 當子類物件釋放時,子類會先執行自己的析構函式,再執行父類的析構函式,在父類的析構函式中呼叫虛函式,由於此時子類物件已經釋放,因此只能呼叫父類的虛函式。

Ojective c 多型中,有關類的問題

bool iskindof class 表示 物件是否為class或其父類 bool ismemberof class 表示 物件是否為class bool respondstoselector selector 表示 物件是否能夠響應selector指定的方法 bool instancerespo...

c 中有關size type的問題

sizt t是 c 的乙個標準的 typedef.全域性有效,定義在全域性命名空間中 size type是 stl定義的,只在 namespace std 中有效vc6中定義 size t 為typedef unsigned int size t size type應該是 c 為例如 string ...

關於JAVA有關類與繼承的學習

本次所學內容分為兩塊,類與繼承。類一共分為三類,普通類,抽象類,以及介面,而方法 也就是函式 則分兩類,普通類和抽象類。方法兩類間的區別就是在於是否存在方法體 即大括號內部的內容 而類之間的區別則分為三點 包含的方法,包含的屬性,是否可以直接創造物件。普通類 只可以包含普通方法,抽象類 包含普通方法...