C 學習(十六) 多型(二)

2021-10-03 16:53:03 字數 1831 閱讀 4037

多型的好處

多型的好處

擴充套件性提高 組織性強 可讀性強

如果父類中有了虛函式,子類並沒有重寫父類的虛函式,那麼這樣的**是毫無意義的

如果子類不重寫父類虛函式,那麼沒有用到多型帶來的好處,而且內部結構還變得更為複雜

#include

using

namespace std;

class

calculator

}int m_a;

int m_b;

protected

:private:}

;// 開閉原則 ——對擴充套件進行開放 對修改進行關閉

// 利用多型實現計算器

class

abstractcalcylator

int m_a;

int m_b;};

class

addcalculator

:public abstractcalcylator};

class

subcalculator

:public abstractcalcylator};

class

multicalculator

:public abstractcalcylator};

void

test01()

// 多型的好處

// 擴充套件性提高 組織性強 可讀性強

// 如果父類中有了虛函式,子類並沒有重寫父類的虛函式,那麼這樣的**是毫無意義的

// 如果子類不重寫父類虛函式,那麼沒有用到多型帶來的好處,而且內部結構還變得更為複雜

intmain()

抽象類和純虛函式

純虛函式 vir tual void f() = 0;

如果乙個類中有純虛函式出現,那麼這個類就無法例項化物件了,有純虛函式的類,也稱為抽象類

如果子類繼承了抽象類,那麼子類必須要重寫父類中的純虛函式,否則子類也屬於抽象類

虛析構和純虛析構

如果子類中有屬性建立在堆區,那麼多型情況不會呼叫子類的析構**,導致記憶體洩露

解決方案:利用虛析構或者純虛析構

純虛析構 類內表明,類外必須實現

如果乙個類中有了純虛析構函式,那麼這個類也屬於抽象類

#include

using

namespace std;

class

animal

virtual

void

speak()

/* virtual ~animal() // 虛析構解決的問題是當子類中有堆區內容,釋放的時候導致釋放不乾淨,記憶體洩漏

*/// 純虛析構 有宣告 也必須有實現 如果乙個類中 有了純虛析構函式 那麼這個類也屬於抽象類

virtual

~animal()

=0;}

;animal::

~animal()

class

cat:

public animal

void

speak()

~cat()

}char

* m_name;

// 貓的姓名};

void

test01()

intmain()

向上向下型別轉換

父類轉子類 向下型別轉換 不安全

子類轉父類 向上型別轉換 安全

如果發生多型,總是安全的

C 多型學習(二)完整定義 什麼是多型?

函式過載,是一種多型現象,通過命名傾軋在編譯階段決定,故稱為靜多型。動多型,不是在編譯器階段決定,而是在執行階段決定,故稱為動多型。動多型形成的條件如下 1,父類中有虛函式。2,子類override 覆寫 父類中的虛函式。3,將子類物件位址賦給父類的指標,並發生虛函式呼叫。如果不用指標,用引用必須一...

C 學習筆記之多型 多型的學習 多型學習

c 學習筆記之多型 多型的學習 多型學習 多型分為兩類 靜態多型 函式過載和運算子過載屬於靜態多型,復用函式名 動態多型 派生類和虛函式實現執行時多型 靜態多型和動態多型的區別 靜態多型的函式位址早繫結 編譯階段確定函式位址 動態多型的函式位址晚繫結 執行階段確定函式位址 動態多型滿足條件 動態多型...

C 多型學習

純虛函式,0是告訴編譯器函式沒有主體 virtual int area 0 這個學習中有個點不懂,是關於指標的,先看 class shape virtual int area 純虛函式 virtual int area 0 class rectangle public shape int area ...