「C++是C的超集」,這句話裏包含了兩個問題:編程
1. C++兼容C;函數
2. C++在C之上進行了擴展;測試
那C++在C之上進行了哪些擴展呢?衆所周知,C++內置了衆多編程機制、支持衆多編程風格:面向過程、基於對象、面向對象、面向、基於模板、泛型、元編程等等。其中,以面向過程、基於對象、面向對象的編程機制最爲流行。spa
你們都知道,面向對象有三個基本特徵:數據封裝與抽象、繼承、多態。下面經過分析C++對象內存模型,來剖析C++面向對象的這三個基本特徵。.net
講到C++的數據封裝和抽象,就不得不提類的成員函數和成員數據:指針
成員數據 非靜態對象、靜態對象 成員函數 非靜態函數、靜態函數、虛函數 下面,直接上測試代碼,直觀的看看C++的基本對象內存模型。code
class A{}; //size: 1 class B{ //size: 1 static int mem; static void print(); }; class C{ //size: 4 int mem; void print(); };class D{ //size: 8 char mem; static int s_mem; virtual void print1(){};virtual void print2(){}; };class E{ //size: 4 virtual void print1() = 0; virtual void print2() = 0; };從測試結果來看,對象
1. 空類的Size爲1,應爲編譯器自動添加了一個標記字節。(Size爲0就太詭異了!)繼承
2. 靜態數據和靜態函數,配置到對象以外。接口
3. 非靜態函數,配置到對象以外。
4. 含有虛函數的對象,配置有一個指向類虛擬表(vtbl)的指針。
5. 純虛對象(接口對象),配置有一個指向類虛擬表的指針。