(筆試題)關於C 的虛函式和多型性

2021-09-08 11:05:46 字數 1368 閱讀 5021

以下兩段程式的輸出是什麼?

#include "stdio.h"

class base

virtual int bar(int x)

}; class derived : public base

int bar(int x)

}; int main(void)

答案: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)

#include using namespace std;

class animal;

class dog : public animal

~dog(){}

virtual void print_age(void)

};class cat:public animal

~cat(){}

virtual void print_age(void)

};int main(void)

答案:miao, my age =2

int*p = (int*)(&kitty);

int*q = (int*)(&jd);

p和q是分別指向kitty和jd兩個物件的首位址,因為類cat和dog都包含虛函式,所以kitty和jd兩個物件均包含乙個虛函式表,並通過乙個指標指向它,p[0]和q[0]就是該虛函式表指標,而p[1]和q[1]則為該物件的資料成員即age的值,p[1]=1,q[1]=2

p[1] = q[1]=2;

kitty的age被修改為2,

animal *pa;

pa = &kitty;

pa->print_age();

pa指標宣告時的型別為基類animal,它指向派生類kitty物件,典型的多型特性,則pa的靜態型別為animal,動態型別為cat。

而print_age()是虛函式,因此是動態繫結,動態繫結指向是動態型別的成員,因此呼叫的是kitty的成員函式print_age(),

cout << " miao,my age= " << this->age << endl;

此時age=2.

C 多型性和虛函式

c 的多型性,我認為就是表達相同方法的函式在不同的類中的表現形式不同 舉個例子,比如 移動這一行為,人是用兩條腿在走路,烏龜是慢慢爬,蛇是爬行,老虎是四條腿在走,魚是在游動 這就是多型性 多型性使不同的物件但是又具有某種共同屬性的物件不但可以在一定程度上共享 還能共享介面。非靜態函式宣告的前面加上v...

C 虛函式和多型性

c 為了實現多型性,提供了靜態繫結 早 或者叫做編譯期繫結 和動態繫結 晚 兩種機制。靜態繫結中包括 1 函式過載 2 運算子過載 3 子類繼承父類時,父類中的函式沒有新增virtual關鍵字 非虛函式 父類指標指向子類的位址時,呼叫和父類同名的函式則會預設呼叫父類的同名函式,子類同名函式的不會被呼...

c 多型性 虛函式

c 中多型性是指通過用virtual關鍵字來繫結同名同引數的函式,實現在編譯中進行後繫結,即在編譯過程中不繫結類,在執行時與具體的物件進行繫結,這樣就可以動態地與實際聯絡 比如乙個類 animal 有乙個虛函式breath 魚類 fish 也有函式breath 狗類 dog 函式breath 具體呼...