阿里機試題目_虛函數

參考:

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)


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章