C 之封裝繼承和多型

2022-02-25 03:40:46 字數 2384 閱讀 5337

c++中非常重要的概念,尤其是相對於c語言而言,也是其具有如此高的工程使用性的重要原因。

封裝

所謂封裝是將某些東西隱藏起來,讓外界無法直接使用,而必須通過某些特定的方式才能訪問。也即是,將抽象得到的資料和行為(類似於屬性和方法)結合構成乙個有機整體,將資料與運算元據的函式構成類,其中資料和函式都是類的成員。

其目的是將物件的使用者和設計者隔離開來,提高軟體的可維護性和可修改性,使用者不必了解具體的實現細節而只是通過外部介面及特定的訪問許可權使用類成員,從而增強了安全性且簡化了程式設計,也使得不同類之間的相互影響降到最低。

乙個類的成員有三種訪問許可權可以選擇

如果沒有顯示宣告,class中的成員資料或成員函式預設訪問許可權是private,struct中預設訪問許可權是public

繼承

指的是新類從已有的類中得到已有的特性。

繼承使得子類具有父類的某些資料和函式,而不需要再次編寫相同的**,在繼承的同時,子類也可以重新定義某些資料和函式並覆蓋父類原有的資料和函式。

一般分為單一繼承和多重繼承,常用的是單一繼承,程式設計簡單,可讀性好。

需要注意的是class預設是private繼承,而struct預設是public繼承。

父類中的訪問許可權

繼承方式

子類中的訪問許可權

public

public

public

private

no access

protected

protected

public

private

private

private

no access

protected

private

public

protected

protected

private

no access

protected

protected

子類會繼承父類/基類除建構函式和析構函式以外的成員函式,一般析構函式定義為虛函式,否則的話析構時只會呼叫父類/基類中定義的析構函式而不會呼叫子類/派生類中的析構函式。

多型

父類成員函式前加virtual修飾就變成了虛函式。

純虛函式就是父類只定義了虛函式而沒有實現,則必須在子類中實現。如果子類中沒有實現則子類仍為虛類,需要子類的子類去實現純虛函式,即哪一層子類實現了純虛函式,哪一層的子類才可以被初始化。純虛函式相當於乙個介面,子類必須實現這個介面才可以使用。

而多型性就是為了介面重用,無論傳遞過來的是哪個子類的物件,都能呼叫相應的子類函式。

多型是我們可以用相同的方式處理不同型別的物件,極大地提高了**的可重複性。

多型性允許將子類型別的指標賦值給父類型別的指標,常通過虛函式來實現。虛函式就是允許子類重新定義的成員函式。

子類重寫父類中的虛函式時,即使不用virtual宣告,該函式也是虛函式,而父類中必須要有virtual宣告。

乙個介面,多種方法,多型主要有兩種形式。

靜態多型

在編譯期將函式鏈結起來,此時即可確定呼叫哪個函式或模板,靜態多型通過過載和模板實現。

在巨集多型中,通過定義變數,編譯時直接把變數替換,實現巨集多型。

泛型程式設計,stl,非常便利

編譯期完成,提高了執行效率

具有很強的適配性和松耦合性

使得程式設計可讀性降低,**除錯困難

無法實現木板的分離編譯,工程量大時編譯時間較長

無法處理異質物件集合

動態多型

在程式執行期間才能確定呼叫哪個函式或實現。父類指標或引用能夠指向子類物件,呼叫子類的函式,所以在編譯時無法確定呼叫哪個函式。

例如在父類中寫乙個虛函式,子類中進行重寫,用乙個指向父類的指標呼叫虛函式,實際上會呼叫在子類中重寫的虛函式。

執行期多型的實現依賴於虛函式機制,當某個類宣告了虛函式時,編譯器將為該類物件安插乙個虛函式表指標,並為該類設定乙個唯一的虛函式表,表中存放該類虛函式的入口位址,執行期間通過虛函式表指標與虛函式表去確定該類虛函式的真正實現。

物件導向設計中非常重要的特性,對客觀世界直覺的認識。

可以處理同一繼承體系下的異質類集合

vectoranims;

animal *anim1 = new

dog;

animal *anim2 = new

cat;

//處理異質類集合例項

anims.push_back(anim1);

anims.push_back(anim2);

執行期間進行虛函式繫結,增加了程式執行開銷

龐大的類繼承層次,對介面的修改容易影響類的繼承層次

虛函式在執行期繫結,編譯器無法對其進行優化

c 之封裝 繼承 多型

類就是乙個封裝體 vector3 3維類 需要定義三個變數 float x y z 類的封裝 封裝的過程 這是在c 中 如果unity則不需要封裝可直接定義 對引數的封裝,當乙個函式包含多個引數時,可以將多個引數定義在乙個類中,這樣直接呼叫這個物件就可以呼叫多個引數 這樣的類僅僅為了封裝 不是現實物...

C 之繼承 多型 封裝

繼承是物件導向的重要概念,如果類b繼承類a,就把這個b成為a的子類,a成為b的父類。繼承成可以使子類擁有父類的各種屬性和方法,而不需要再次編碼,在子類繼承父類的同時,可以重新定義某些屬性,並重寫某些方法或者定義新方法。多型可以使我們以相同的方式處理不同型別的物件,只要他們繼承了或實現了相同的型別。這...

C 之封裝 繼承 多型初識

封裝就是把一些具體的功能實現寫在乙個檔案內,留給外部乙個介面,呼叫者通過介面呼叫方法,實現功能。繼承就是子類繼承父類的所有屬性和方法,然後在新增自己的屬性跟該方法。多型是父類有的方法,子類過載時呼叫自己的方法,或者是父類指標指向子類物件時,呼叫方法,如果子類有過載就呼叫子類的,如果沒有就呼叫父類的。...