C 虛析構和虛函式的原理

2022-08-23 09:06:12 字數 1820 閱讀 2695

c++中的虛函式的作用主要是實現了多型的機制。關於多型,簡而言之就是用父型別別的指標指向其子類的例項,然後通過父類的指標呼叫實際子類的成員函式。這種技術可以讓父類的指標有「多種形態」,這是一種泛型技術。所謂泛型技術,說白了就是試圖使用不變的**來實現可變的演算法。比如:模板技術,rtti技術,虛函式技術,要麼是試圖做到在編譯時決議,要麼試圖做到執行時決議

同名函式下,有virtual修飾=覆蓋,無virtual=隱藏

1、類內沒有資料成員的情況下,例項化物件所佔位元組為1位元組,有資料成員為資料成員的大小之和;

2、類內有虛成員函式,那麼在例項化的時候會產生乙個虛函式表指標,物件的大小為4位元組。

3、虛析構函式可以使類例項物件的時候一樣為產生乙個虛函式表指標,大小為4位元組;

如果父類成員函式被virtual修飾,子類繼承,會繼承父類的虛函式表,如果子類同名的函式也被virtual修飾。

也可以把父類的虛函式表的同名函式指標位址覆蓋掉,變為自己的指標位址。

例如:

#include /**

* c++虛構函式和虛函式指標的原理

*/using namespace std;

class shape ;

class circle : shape ;

circle::circle(int r)

circle::~circle()

shape::shape()

shape::~shape()

double shape::calcarea()

int main()

輸出結果:

1  //如果物件 沒有任何資料,1代表乙個佔位符,代表是乙個物件

4 //物件有成員資料的話,就顯示成員資料佔據的大小。

#include /**

* c++虛構函式和虛函式指標的原理

*/using namespace std;

class shape ;

int main()

輸出結果:

//電腦是64位的,顯示的結果不太一樣

816 //int 4為位,虛函式表8位, 顯示16 可能是自動補齊

驗證是否有虛函式表存在:

shape shape;

cout << sizeof(shape) << endl;

//&shape 取得位址符是 shape型別的指標,要它強轉為int指標

int *p = (int *) &shape;

cout << (unsigned int) (*p) << endl;

circle circle(100);

cout << sizeof(circle) << endl;

int *q=(int*)&circle;

cout << (unsigned int) (*q) << endl;

q++;//64位系統 每一次++只前進4位 所以要加兩次

q++;

cout << (unsigned int) (*q) << endl;

return 0;

輸出結果:

8

4206848 //位址值

164206880 //位址值

100 //int的值

C 虛函式,純虛函式,虛析構和純虛析構

c 虛函式 定義為虛函式是為了允許用基類的指標來呼叫子類的這個函式,是需要具體實現的 virtual void funtion1 c 純虛函式 一 定義 純虛函式是在基類中宣告的虛函式,它在基類中沒有定義,但要求任何派生類都要定義自己的實現方法。在基類中實現純虛函式的方法是在函式原型後加 0 vir...

C 虛析構函式和純虛析構函式

我們知道析構函式是在物件生命週期結束時自動被呼叫,用來做一些清理工作 如釋放控制代碼,釋放堆記憶體等 防止出現記憶體洩漏。那怎麼還有虛析構函式呢?使用虛析構函式的類一般是要作為基類,被其他類繼承。通過把基類的析構函式宣告為虛函式,就可以通過父類指標來釋放子類物件,從而完成子類的一些清理工作,防止出現...

c 的虛析構函式和純虛析構函式

虛函式是用作實現子類的多型性的,它可以在執行的過程中選擇子類或者父類的同名函式,意思就是說,每次只有乙個函式執行。但是對於析構函式來說,子類 與父類在銷毀物件時,都應該要呼叫 所以把父類的析構函式定義為虛函式,會發生什麼事情呢。class class b public a int main 可以發現...