參考:
http://www.mamicode.com/info-detail-864409.html
class my
{};
int main()
{
my data;
cout<<sizeof(data)<<endl;
}
當我們建立一個類,類中什麼數據也沒定義,建立該類的一個對象,可以測試其對象所佔的字節數爲1。
class my
{
char b;
};
int main()
{
my data;
cout<<sizeof(data)<<endl;
}
這個類中只有一個char型數據,佔一個字節。
class my
{
char b;
short a[7];
};
int main()
{
my data;
cout<<sizeof(data)<<endl;
}
my類中char類型佔1個字節,short類型每個佔2個字節,考慮到字節對齊的原因,這個類的一個對象佔16個字節。
class father
{
virtual void function(){};
};
class child:public father
{
};
int main()
{
father data_f;
child data_c;
cout<<sizeof(data_f)<<endl;
cout<<sizeof(data_c)<<endl;
}
父類father中存在虛函數,子類child繼承父類。父類和子類對象中都存在一個指針,指向虛函數表。所以sizeof(data_f)爲4,sizeof(data_c)爲4。
#include <iostream>
using namespace std;
class animal
{
protected:
int age;
public:
virtual void print_age(void) = 0;//純虛函數
};
class dog : public animal
{
public:
dog(){this -> age = 2;}
~dog(){}
virtual void print_age(void){cout<<"Wang, my age = "<<this -> age<<endl;}
};
class cat: public animal
{
public:
cat(){this -> age = 1;}
~cat(){}
virtual void print_age(void){cout<<"Miao, my age = "<<this -> age<<endl;}
};
int main(void)
{
cat kitty;//1
dog jd;//2
animal * pa;//3
int * p = (int *)(&kitty);//4
int * q = (int *)(&jd);//5
p[1] = q[1];//6
pa = &kitty;//7
pa -> print_age();//8
<span style="white-space:pre"> </span>pa=&jd;//9
<span style="white-space:pre"> </span>pa->print_age();//10
return 0;
}
第1行定義了cat類的一個對象kitty,這將調用cat::cat()構造函數。第2行定義了dog類的一個對象jd,這將調用dog::dog()構造函數。
第3行:定義了一個基類指針,因爲類animal中含有純虛函數,所以不能定義animal類的對象。
第4行:先是用&符號取得對象kitty的地址,並使用強制類型轉換把對象指針轉化爲int 類型的指針。
第5行:先是用&符號取得對象jd的地址,並使用強制類型轉換把對象指針轉化爲int類型的指針。
第6行:
p和q是分別指向kitty和jd兩個對象的首地址,因爲類Cat和Dog都包含虛函數,所以kitty和jd兩個對象均包含一個虛函數表,並通過一個指針指向它,p[0]和q[0]就是該虛函數表指針,而p[1]和q[1]則爲該對象的數據成員即age的值,p[1] = q[1];將kitty的age被修改爲2。
第7、8:
pa指針聲明時的類型爲基類animal,它指向派生類kitty對象,典型的多態特性,則pa的靜態類型爲animal,動態類型爲cat。
而print_age()是虛函數,因此是動態綁定,動態綁定指向是動態類型的成員,因此調用的是kitty的成員函數print_age()。
第9、10:
pa指針聲明時的類型爲基類animal,它指向派生類jd對象,典型的多態特性,則pa的靜態類型爲animal,動態類型爲dog。
而print_age()是虛函數,因此是動態綁定,動態綁定指向是動態類型的成員,因此調用的是jd的成員函數print_age()。
#include "stdio.h"
class Base
{
public:
int Bar(char x)
{
return (int)(x);
}
virtual int Bar(int x)
{
return (2 * x);
}
};
class Derived : public Base
{
public:
int Bar(char x)
{
return (int)(-x);
}
int Bar(int x)
{
return (x / 2);
}
};
int main(void)
{
Derived Obj;
Base *pObj = &Obj;
printf("%d<span style="white-space:pre"> </span>", pObj->Bar((char)(100)));
printf("%d<span style="white-space:pre"> </span>", pObj->Bar(100));
}
輸出100 50
Derived Obj;
Base *pObj = &Obj;
printf("%d,", pObj->Bar((char)(100)))
printf("%d,", pObj->Bar(100));
第一個Bar(char)是非虛函數,因此是靜態綁定,靜態綁定是指指針指向聲明時的對象,pObj聲明時爲Base類,因此調用的是Base類的Bar(char)
第二個Bar(char)是虛函數,因此是動態綁定,動態綁定是指指針指向引用的對象,pObj引用Derived對象,因此調用的是Derived類的Bar(int)