實驗六 多型性與虛函式

2021-08-20 21:27:48 字數 4573 閱讀 3604

一、實驗目的和要求

了解靜態聯編和動態聯編的概念。掌握動態聯編的條件。

二、實驗內容

1、分析並除錯下列程式。

[cpp] 

view plain

copy

//sy6_1.cpp

#include

using

namespace

std;  

class

base  

;  class

derived:

public

base  

;  int

main()  

(1)找出以上程式中使用了過載和覆蓋的函式。

答:base類中函式void g(); 和void h();與derived類中的函式void g(); 和void h();函式名相同,引數型別不同,構成了函式過載。

(2)寫出程式的輸出結果,並解釋輸出結果。

2、分析並除錯下列程式。

[cpp] 

view plain

copy

//sy6_2.cpp

#include

using

namespace

std;  

class

base  

;  class

derived:

public

base  

;  int

main()  

(1)找出以上程式中使用了過載和覆蓋的函式。

答:base類中函式void f(); 在同一作用域中,函式名相同,引數型別不同,構成了函式過載。

(2)寫出程式的輸出結果,並解釋輸出結果。

3、分析並除錯下列程式

[cpp] 

view plain

copy

//sy6_3.cpp

#include

using

namespace

std;  

class

point  

double

area()  

private

:  double

x,y;  

};  

class

rectangle:

public

point  

double

area()  

private

:  double

w,h;  

};  

intmain()  

[cpp] 

view plain

copy

寫出程式的輸出結果,並解釋輸出結果。  

4、分析並除錯下列程式。

[cpp] 

view plain

copy

//sy6_4.cpp

#include

using

namespace

std;  

const

double

pi=3.1415;  

class

shap  

;  class

********:

public

shap  

double

area()  

private

:  double

h,w;  

};  

class

rectangle:

public

shap  

double

area()  

private

:  double

h,w;  

};  

class

circle:

public

shap  

double

area(){}

return

pi*r*r;}  

private

:  double

r;  

};  

class

square:

public

shap  

double

area(){}

return

s*s;}  

private

:  double

s;  

};  

double

total(shap*s,

intn)  

intmain()  

執行結果:

(1)指出抽象類。

(2)指出純虛函式,並說明它的作用。

(3)每個類的作用是什麼?整個程式的作用是什麼?

5. 某學校對教師每個月工資的計算規定如下:固定工資+課時補貼;教授的固定工資為5000元,每個課時補貼50;副教授的固定工資為3000,每個課時補貼30元;講師的固定工資為2000元,每個課時補貼20元。定義教師抽象類,派生不同職稱的教師類,編寫程式求若干個教師的月工資。(sy6_5.cpp)

[cpp] 

view plain

copy

//sy6_5.cpp  

#include 

using

namespace

std;    

class

teacher    

;    

class

professor:

public

teacher    

;    

intsalary()    

;    

void

print(

intmoney)    

;    

};    

class

associateprofessor:

public

teacher    

;    

intsalary()    

;    

void

print(

intmoney)    

;    

};    

class

lecturer:

public

teacher    

;    

intsalary()    

;    

void

print(

intmoney)    

;    

};    

intmain()    

執行結果:

6. 把實驗5中的第4題的shape類定義為抽象類,提供共同操作介面的純虛函式。twodimshape類和threedimshape類仍然抽象類,第3層具體類才能提供全部函式的實現。在測試函式中,使用基類指標實現不同派生類物件的操作。

三、分析與討論

1、結合實驗內容中第1題和第2題,說明過載與覆蓋的區別。

答:過載與覆蓋的區別:1、方法的覆蓋是子類和父類之間的關係,是垂直關係;方法的過載是同乙個類中方法之間的關係,是水平關係2、覆蓋只能由乙個方法,或只能由一對方法產生關係;方法的過載是多個方法之間的關係。3、覆蓋要求引數列表相同;過載要求引數列表不同。4、覆蓋關係中,呼叫那個方法體,是根據物件的型別(物件對應儲存空間型別)來決定;過載關係,是根據呼叫時的實參表與形參表來選擇方法體的。

2、總結靜態聯編和動態聯編的區別和動態聯編的條件。

答:靜態聯編是指聯編工作在編譯階段完成的,這種聯編過程是在程式執行之前完成的,又稱為早期聯編。要實現靜態聯編,在編譯階段就必須確定程式中的操作呼叫(如函式呼叫)與執行該操作**間的關係,確定這種關係稱為束定,在編譯時的束定稱為靜態束定。靜態聯編對函式的選擇是基於指向物件的指標或者引用的型別。其優點是效率高,但靈活性差。

動態聯編是指聯編在程式執行時動態地進行,根據當時的情況來確定呼叫哪個同名函式,實際上是在執行時虛函式的實現。這種聯編又稱為晚期聯編,或動態束定。動態聯編對成員函式的選擇是基於物件的型別,針對不同的物件型別將做出不同的編譯結果。c++中一般情況下的聯編是靜態聯編,但是當涉及到多型性和虛函式時應該使用動態聯編。動態聯編的優點是靈活性強,但效率低。

動態聯編的條件:必須把動態聯編的行為定義為類的虛函式;類之間應滿足子型別關係,通常表現為乙個類從另乙個類公有派生而來;必須先使用基類指標指向子型別的物件,然後直接或者間接使用基類指標呼叫虛函式。

四、實驗小結

通過本次實驗我們了解了靜態聯編和動態聯編的概念,學習了動態聯編的條件。

實驗六 多型性與虛函式

了解靜態聯編的動態聯編的概念。1.分析並除錯下列程式。include using namespace std class base 1 找出以上程式中使用了過載和覆蓋函式。答 base類中函式void g 和void h 與derived類中的函式void g 和void h 函式名相同,引數型別不...

複習六 虛函式與多型性

一 靜態聯編 1 聯編是指乙個程式模組 之間互相關聯的過程。靜態聯編,是程式的匹配 連線在編譯階段實現,也稱為早期匹配。過載函式使用靜態聯編。動態聯編是指程式聯編推遲到執行時進行,所以又稱為晚期聯編。switch 語句和 if 語句是動態聯編的例子。2 過載函式要根據型別 引數進行匹配,一般在編譯階...

實驗6,多型性與虛函式

一 實驗目的和要求 了解靜態聯編和動態聯編的概念。掌握動態聯編的條件。二 實驗內容 1 分析並除錯下列程式。sy6 1.cpp includeusing namespace std class base 1 找出以上程式中使用了過載和覆蓋的函式。答 base類中函式void g 和void h 與d...