c 之多型詳解

2021-10-08 07:16:42 字數 2268 閱讀 4436

以下是阿鯉對c++中多型的學習總結,希望可以幫助到大家

1:什麼是多型?

2:多型的定義和實現

3:多型的原理

首先讓我們看看什麼是多型?

顧名思義,就是多種形態,具體點講就是在完成某個行為的時候,不同的物件會產生不同的狀態。

那麼c++是怎樣定義多型和實現的呢?

在c++中想要構成多型,需要滿足以下兩個條件:

1:呼叫函式的物件必須是指標或引用

2:被呼叫的函式必須是虛函式,且完成了虛函式的重寫

舉個栗子:

#includeusing namespace std;

class person

};class student:public person

};void func(person &people)

int main()

看著上面這段**,這就是c++中多型的簡單實現;那麼為什麼呢?1:這段**在函式上加上了virtual,這就說明它滿足了這是乙個虛函式

2:在派生類中,派生類有乙個完全相同的虛函式,這就完成了虛函式的重寫

3:在func函式中,我們是通過引用去呼叫函式的

ok,我們發現這段**已經完成了c++的多型,那麼怎樣體現呢?

如果你執行這段**,就會列印出

這就是c++中的多型;

ok,我們看到了多型的實現了,那c++多型的原理有是什麼呢?

首先,我們列印一下這兩個類答大小看看:

cout << sizeof(person) << endl;

cout << sizeof(student) << endl;

結果輸出為:4 ,4 ;

我們都知道,空類的位址是1(用來表示這個類),而類中的函式是算在類的大小中的(儲存在**段,共享);

但是,通過我們的列印發現,帶有虛函式的類的大小為4,那麼這就說明了類中儲存了某種東西,來幫助c++實現多型

我們通過編譯看看,發現在由這兩個類例項化出的物件中含有_vfptr這麼個東西;它叫做虛函式表指標;

這個虛函式表指標指向乙個虛函式表;這個虛函式表裡就存放著我們的虛函式指標;

而且觀察仔細的同學就會發現在wangwu這個物件中,它的虛函式是儲存在父類的虛函式表指標中的。但是虛函式已經被重寫了。

總結&擴充套件:

1:c++的繼承是通過虛函式表實現的

2:虛函式表只會儲存虛函式,而且若被重寫,派生類中就是重寫後的虛函式

3:基類和派生類的虛函式表是不同的

4:虛函式指標,是類的一部分成員

5:派生類i中新新增的虛函式會放在虛函式表的後面

6:注意:虛表儲存的是虛函式指標,而虛標是儲存在**段中的。

說了這麼多,那麼多型的原理到底是什麼?

我們在看看這張圖:

張三在呼叫時候,呼叫的是上面的函式,而王五在呼叫的時候就是下面的函式了;

並且這些函式呼叫都是在**執行起來之後確定的,而不是在編譯期間確定的。

補充乙個概念:

靜態繫結和動態繫結:

靜態繫結:編譯期間就確定了程式的行為;比如函式過載

動態繫結:是在程式執行期間,根據具體拿到的型別確定具體的行為;動態一定是動態繫結的。

以上就是我對多型的介紹了,如果有誤請多多指正。

C 學習之多型

多型性是物件導向程式設計中的乙個重要特徵,利用多型性可以設計和實現乙個易於拓展的系統。在c 語言中,多型性是指具有不同功能的函式可以用同乙個函式名,這樣就可以用乙個函式名呼叫不同內容的函式,發出同樣的訊息被不同型別的物件接收時,導致完全不同的行為。多型性通過聯編實現。聯編是指乙個電腦程式自身彼此關聯...

初識C 之多型

多型性是將介面與實現進行分離 用形象的語言來解釋就是實現以共同的方法,但因個體差異,而採用不同的策略。1 什麼是多型 多型 polymorphism 按字面的意思就是 多種狀態 在物件導向語言中,介面的多種不同的實現方式即為多型。它是物件導向程式設計 oop 的乙個重要特徵。如果乙個語言只支援類而不...

C 特性之多型

今天學習了一下多型的有關知識。在 c primer 書中,多型特性似乎只在書的後半部分 oo 裡面提到。雖然是物件導向中很重要的乙個概念,但是並未單獨開出乙個章節來介紹。網上找了一些多型的介紹和程式,總結如下 其底層含義是大記憶體 父類 中套著許多小記憶體 子類 父類 class animal 子類...