C 多型及類的大小

2021-09-11 00:12:53 字數 1520 閱讀 6904

個人理解:

多型就是不同場景下乙個類所表達出的不同狀態,其分類為靜態多型和動態多型,

1.靜態多型:我們所知道的函式過載便是,這種靜態多型是在編譯期間就完成的,編譯期間編譯器根據情況選擇呼叫合適的函式完成函式過載。要是沒有合適的就報錯。

2.動態多型:我們用的非常多的一種多型,動態多型我就不能不講乙個關鍵字。

virtual:在類的成員函式宣告前加上virtual,則這個成員函式叫虛函式,這時,類會在類內最上面加上乙個隱藏的指標,指標指向乙個表,這個表內就是所有虛函式的位址。

定義先講到這,我們回到多型,多型的兩個必要條件:

1)基類中必須包含虛函式。

2)並且派生類中一定要對基類中的虛函式進行重寫。

這我個人的理解是:(虛函式表中的虛函式位址可以用來重寫,當物件要重寫父類物件中的虛函式時,便將子類函式的指標放入虛函式表中對應的位置。這樣完成了對父類虛函式的重寫)。那這時我們需要注意什麼函式可以做虛函式。

虛函式的定義要遵循以下重要規則:

1.如果虛函式在基類與派生類**現,僅僅是名字相同,而形式引數不同,或者是返回型別不同,那麼即使加上了virtual關鍵字,也是不會進行滯後聯編的。 

2.只有類的成員函式才能說明為虛函式,因為虛函式僅適合用與有繼承關係的類物件,所以普通函式不能說明為虛函式。 

3.靜態成員函式不能是虛函式,因為靜態成員函式的特點是不受限制於某個物件。 

4.內聯(inline)函式不能是虛函式,因為內聯函式不能在執行中動態確定位置。即使虛函式在類的內部定義定義,但是在編譯的時候系統仍然將它看做是非內聯的。 

5.建構函式不能是虛函式,因為構造的時候,物件還是一片位定型的空間,只有構造完成後,物件才是具體類的例項。 

6.析構函式可以是虛函式,而且通常聲名為虛函式。

抽象類:

在虛函式宣告後面加=0;如下:

virtual void person(takebus& tb) = 0;

這時,這個函式就叫純虛函式(=0就變成純的了!!!),如果乙個類中有純虛函式,那麼這個類就交抽象類(孩子變純,爸爸變抽象。。。)。純虛函式是沒有具體實現的,完全需要其派生類中對其繼承進行具體實現(重寫),否則純虛函式則一點用沒有。

類的大小:

1.空類:空類即什麼都沒有的類,按上面的說法,照理說大小應該是0,但是,空類的大小為1,因為空類可以例項化,例項化必然在記憶體中占有乙個位置,因此,編譯器為其優化為乙個位元組大小。

2.一般類的大小(沒有虛函式啥的):成員變數的大小,此時空表的1就消失了。但是需要注意記憶體對其。比如:

class a

char a;

int  b;

double c;

為16個位元組。而:

class a

double c;   

int  b;

char a;

}為24位元組。需要注意

C 類的多型

多型按字面的意思就是多種形態。當類之間存在層次結構,並且類之間是通過繼承關聯時,就可能會用到多型。c 多型就是當呼叫成員函式時,會根據呼叫函式的物件的型別來執行不同的函式。我們以前說過的函式過載就是乙個簡單的靜態多型,靜態多型是編譯器在編譯期間完成的,編譯器會根據實參型別來選擇呼叫合適的函式,如果有...

C 類的多型

多型按字面的意思就是多種形態。當類之間存在層次結構,並且類之間是通過繼承關聯時,就可能會用到多型。c 多型就是當呼叫成員函式時,會根據呼叫函式的物件的型別來執行不同的函式。我們以前說過的函式過載就是乙個簡單的靜態多型,靜態多型是編譯器在編譯期間完成的,編譯器會根據實參型別來選擇呼叫合適的函式,如果有...

C 類的多型

多型按字面的意思就是多種形態。當類之間存在層次結構,並且類之間是通過繼承關聯時,就可能會用到多型。c 多型就是當呼叫成員函式時,會根據呼叫函式的物件的型別來執行不同的函式。我們以前說過的函式過載就是乙個簡單的靜態多型,靜態多型是編譯器在編譯期間完成的,編譯器會根據實參型別來選擇呼叫合適的函式,如果有...