繼承與多型

2021-09-24 16:31:47 字數 3140 閱讀 5188

繼承:

當乙個類從另乙個 類繼承時,可以有3種派生型別:公有型(public)、保護型(protected)和私有型(private)。

繼承概念:在原有的類不變的基礎之上,新增一些函式,對功能進行拓展。繼承說白了就是為了提高程式的可復用性。但是在乙個**中不能過度使用繼承,否則會導致**可讀性降低,而且檢查出錯的時候也難以改正。

繼承定義:繼承就是在乙個已存在的類的基礎上建立乙個新的類,已存在的類稱為基類。新建立的類稱為派生類,乙個新類從已有的類那裡獲得已有的特性,這種現象叫繼承。派生類繼承了父類的全部資料成員和成員函式。

繼承語法:

class 派生類名:繼承方式 基類名1, 繼承方式 基類名2,...,繼承方式 基類名n

;繼承特點:

(1) 派生類是對基類的擴充套件,派生類可以新增新的成員,但不能移除已經繼承的成員的定義。

(2)繼承是可以傳遞的。如果c從b中派生,b又從a中派生,那麼c不僅繼承了b中宣告的成員,同樣也繼承了a中宣告的成員。

(3)建構函式和析構函式不能被繼承,除此之外其他成員能被繼承。基類中成員的訪問方式只能決定派生類能否訪問它們。

(4)派生類如果定義了與繼承而來的成員同名的新成員,那麼就可以覆蓋已繼承的成員,但這兵不是刪除了這些成員,只是不能再訪問這些成員。

(5)類可以定義虛方法、虛屬性及虛索引指示器,它的派生類能夠過載這些成員,從而使類可以展示出多型性。

(6)派生類只能從乙個類中繼承,可以通過介面來實現多重繼承。

派生類成員的訪問屬性:

公用繼承:它的訪問限定符是public。基類的公用成員和保護成員(protected)在派生類中成了基類私有成員。

私有繼承:在宣告乙個類的時候把繼承方式宣告為private(私有)的形式,稱為私有繼承, 派生類稱為私有派生類。在基類中的私有成員在私有派生類中是不可訪問的,基類的公有成員和保護成員在私有派生類中是私有的。

保護繼承:基類的公有成員和私有成員都以保護成員的身份出現在派生類中,而基類的私有成員不可訪問。派生類的其他成員可以直接訪問從基類繼承來的公有和保護成員,但是類外部通過派生類的物件無法訪問它們,無論派生類的成員還是派生類的物件,都無法訪問基類的私有成員。

繼承方式下的構造與析構:

基類——>資料成員——>構造

析構——>資料成員——>基類

其中我認為以下情況不合適使用繼承:

二、如果類b有必要使用a的功能,則要分兩種情況考慮:

(1)若在邏輯上b是a的''一種''(a kind of),則允許b繼承a的功能。

(2)若在邏輯上a是b的''一部分''(apart  of),則不允許b繼承a的功能,而是要用a和其它東西組合出b。

繼承體系中的作用域:

1、基類和派生類不是同一塊作用域 。

2、同名隱藏問題:因為派生類中有與基類同名的成員,派生類中將隱藏基類的同名成員,不能直接訪問,可以通過 (基類名::基類成員)的方式訪問。

注意事項:

1、子類繼承父類時,如果出現同名方法時,可能會隱藏父類的方法。

2、如果子類隱藏了父類的方法,則父類中所有同名的方法均被隱藏。

3、在派生完乙個子類後,可以定義乙個 父類的型別指標,通過子類的建構函式為其建立物件。

多型:原理:

在基類裡函式加virtual,在派生類中重寫此函式,那麼執行時將根據物件的實際型別來呼叫相應的函式。如果物件是派生類就呼叫派生類的函式,如果物件是基類就呼叫基類的函式。

含義:多型是物件導向語言的重要特性,是指不同物件接收到同一訊息時會產生不同的行為。其實多型就是在同乙個類或繼承體系結構的基類與派生類中,用同名函式來實現不同的功能。多型則是基類使用派生類的方法。一般,我們使用多型是為了避免在基類裡大量過載引起**臃腫且難於維護。

概念:重寫(覆蓋):兩個函式具有相同函式名,返回型別,參數列。

過載:函式或者方法有相同的名稱。

靜態多型性:採用靜態聯編的方式實現的多型,所謂靜態聯編是通過函式過載和運算子過載實現的。

動態多型性:通過繼承和虛函式,在程式執行時通過動態繫結實現的。

多型主要是為了降低程式的耦合度,就是說,寫乙個類不僅用一次,只能被某個類使用,而且,可以被不同的場景使用,只需要繼承和重寫就可以了。

虛函式:當基類物件的指標指向派生類物件時,只能通過它訪問到派生類中的基類子物件。虛函式只能在類中定義,即只能把類的成員函式宣告為虛函式,不屬於任何類的普通函式不能被定義為虛函式。

虛函式的執行機制為:如果基類中的非靜態成員函式被定義成為虛函式,且當派生類重寫了該函式,當通過指向基類物件的指標或引用呼叫派生類物件中的虛函式時,就會呼叫該指標實際所指物件的成員函式。一旦將某個成員函式宣告為虛函式後,其派生類重寫該函式是並沒有把它宣告為虛函式,它仍然為虛函式。

c++物件導向程式中存在三種多型

1、物件型別的多型:派生類的物件的型別既可以是派生類,也可以是基類,即乙個物件可以屬於多種型別。

2、物件標識的多型:基類的指標或引用可以指向或引用基類物件,也可以指向或引用派生類物件,即乙個物件標識可以屬於多種型別,它可以標識多種物件。在物件識別符號定義時指定的型別稱為它的靜態型別,而在執行時實際標識的物件的型別稱為它的動態型別。

3、訊息的多型:乙個可以傳送到基類物件的訊息,也可以傳送到派生類物件,從而可能得到不同的解釋。

c++的多型性用一句話概括就是:在基類的函式前加上virtual關鍵字,在派生類中重寫該函式,執行時將會根據物件的實際型別來呼叫相應的函式。如果物件型別是派生類,就呼叫派生類的函式;如果物件型別是基類,就呼叫基類的函式

1:用virtual關鍵字申明的函式叫做虛函式,虛函式肯定是類的成員函式。

2:存在虛函式的類都有乙個一維的虛函式表叫做虛表,類的物件有乙個指向虛表開始的虛指標。虛表是和類對應的,虛表指標是和物件對應的。

3:多型性是乙個介面多種實現,是物件導向的核心,分為類的多型性和函式的多型性。

4:多型用虛函式來實現,結合動態繫結.

5:純虛函式是虛函式再加上 = 0;

6:抽象類是指包括至少乙個純虛函式的類。

多型與非多型的實質區別就是函式位址是早繫結還是晚繫結。如果函式的呼叫,在編譯器編譯期間就可以確定函式的呼叫位址,並生產**,是靜態的,就是說位址是早繫結的。而如果函式呼叫的位址不能在編譯器期間確定,需要在執行時才確定,這就屬於晚繫結。

那麼多型的作用是什麼呢,封裝可以使得**模組化,繼承可以擴充套件已存在的**,他們的目的都是為了**重用。而多型的目的則是為了介面重用。也就是說,不論傳遞過來的究竟是那個類的物件,函式都能夠通過同乙個介面呼叫到適應各自物件的實現方法。

繼承與多型

繼承 繼承是c 語言支援 重用及多型的重要機制。通過繼承,可以繼承可以在現有類的基礎上派生出新類,新類將共享現有類的成員,並且還可以新增新的成員。c 語言中,重用主要表現為可以使用現成的類 如.net框架類庫中的類 來定義新類,主要方法有組合和繼承兩種 繼承是物件導向程式設計支援 重用的另乙個重要機...

繼承與多型

虛函式只要在基類裡定義,所以繼承類都不用重新定義為虛函式,自動成為虛函式。虛函式必須有實現,普通成員函式在沒有呼叫時可以沒有實現 定義 class animal 只需要在基類定義函式為虛,子類中不需要新增virtual.smile函式在沒有呼叫時可以不實現。當有函式為虛函式時,析構函式應定義為vir...

繼承與多型

繼承需要符合的關係 is a,父類更通用 子類更具體 子類繼承父類的所有屬性和方法 不包括父類構造方法 super可以呼叫父類的方法和構造方法 子類可以重寫父類的方法 使用多型之後,當需要增加新的子類型別時,無需更改總部類,程式的可擴充套件性及可維護性增強 簡單來說,多型是具有表現多種形態的能力的特...