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 可以發現...