#include <iostream>
using namespace std;
class Fruit{
int no;
double weight;
char key;
public:
void print() { }
virtual void process(){ }
};
class Apple: public Fruit{
int size;
char type;
public:
void save() { }
virtual void process(){ }
};
int main()
{
int size;
Fruit f;
Apple a;
cout << sizeof(Fruit) << " " << sizeof(f)
<< endl;
cout << sizeof(Apple) << " " << sizeof(a);
return 0;
}
Fruit對應(yīng)的輸出是32
Apple對應(yīng)的輸出是40
為什么呢?
因為有兩個容易被忽略的因素:
- 字節(jié)對齊
- 虛函數(shù)指針
字節(jié)對齊:
為了使指針+1命令安全,每一個結(jié)構(gòu)體內(nèi),需以最大結(jié)構(gòu)體內(nèi)類型所占內(nèi)存大小進(jìn)行地址對齊。
虛函數(shù)指針:
虛函數(shù)指針是用來維護(hù)虛函數(shù)表入口同一性的指針變量。用來記錄目標(biāo)虛函數(shù)對應(yīng)的虛函數(shù)表入口。同時在繼承時也成為作為父類對象的一部分被子類對象繼承。