多型實現及虛函式

2021-10-21 16:55:00 字數 1702 閱讀 4261

多型是c++物件導向三大特性之一

多型分為兩類:

1.靜態多型:函式過載和運算子過載屬於靜態多型

2.動態多型:派生類與虛函式實現執行時多型

區別:靜態多型的函式位址早繫結-編譯階段確定函式位址

動態多型的函式位址晚繫結-執行階段確定函式位址

class

animal

}class

cat:

public animal

}//屬於函式過載,位址早繫結,所以不管傳入的是什麼類,輸出的都是animal類

void

speak

(animal & animal)

intmain()

上述**輸出的結果是:動物在說話

若想實現輸出:小貓在說話。需要採用動態多型

class

animal

}//根據傳入的不用類,就會執行該類中的同名函式

class

cat:

public animal

}

動態多型滿足條件:

1.有繼承關係

2.子類要重寫父類中的虛函式,完全一樣,virtual可加可不不加

動態多型的使用:

父類的指標或引用 指向子類物件

下面講解一下多型的原理:

class

animal

}

首先看上面的**,上面這個類一共占用4個位元組,實際上,在animal中有乙個指標,名稱為vfptr(虛函式指標),v-virtual f-function ptr-pointer,該指標指向vftable(虛函式表),在該表中儲存 的是虛函式的位址,即&animal::speak.

我們在定義它的乙個子類:

class

cat:

public animal

//若是在 cat類中什麼 都不寫,那麼cat類中虛函式表記錄的是 &animal::speak

}

此時,在 cat類中,在vftable(虛函式表)中儲存 的位址既是&cat::speak,而不再是&animal::speak。也就能輸出我們想要的結果。

在多型中,通常父類中的虛函式的實現都是毫無意義的,主要都是 呼叫子類中重寫的內容。

因此可以將父類中的虛函式改為純虛函式。

語法:virtual 返回值型別 函式名(引數列表)= 0;

當類中有了純虛函式,這個類也稱為抽象類。

抽象類特點:

無法例項化物件

子類必須重寫抽象類中的純虛函式,否則也屬於抽象類

**多型使用時,如果子類有屬性開闢到堆區,那麼父類指標在釋放時無法呼叫子類中的析構函式

解決方式:將父類中的析構函式改為虛析構或純虛析構,這樣父類指標在釋放時就可以 呼叫子類的析構函式,繼而能釋放的開闢在子類中的空間。

虛析構和純虛析構共性:

可以解決父類指標釋放子類物件

都需要有具體的函式實現

區別:如果是純虛析構,該類屬於抽象類,無法例項化物件

如果寫成純虛函式,必須要在類外實現一下,即使是空實現。

class

base

base::

~base()

利用虛函式實現多型

關鍵字 virtual 針對基類的不同派生類,如果派生類重新定義虛函式,那麼派生類的虛函式將覆蓋基類對應虛函式的實現。如果強制派生類定義某個函式,則可以在基類中將這個虛函式宣告為純虛函式,也就是基類不實現這個虛函式,所有實現留給派生類。當類中含有純虛函式時,這個類就是抽象類。不能建立抽象類的物件,否...

虛函式如何實現多型 ?

虛函式聯絡到多型,多型聯絡到繼承。關於多型,簡而言之就是用父型別別的指標指向其子類的例項,然後通過父類的指標呼叫實際子類的成員函式。這種技術可以讓父類的指標有 多種形態 這是一種泛型技術。所謂泛型技術,說白了就是試圖使用不變的 來實現可變的演算法。比如 模板技術,rtti技術,虛函式技術,要麼是試圖...

多型實現之虛函式

多型的實現分為靜態多型和動態多型,靜態多型主要靠函式過載,動態多型主要靠虛函式 當類中宣告了虛函式之後,該類的記憶體映像會獲得乙個虛表指標,叫做 vfptr指向該類的虛表,下面的我測試使用的類圖 有的沒必要的東西沒有寫 這裡恰好還是乙個菱形繼承,但是就像我之前說的虛繼承和虛表關係不大,所以單繼承也是...