第十三週閱讀程序4:繼承與指針

問題及代碼:

#include <iostream>
using namespace std;
class Vehicle  //交通工具
{
public:
    void run() const
    {
        cout << "run a vehicle. "<<endl;
    }
};
class Car: public Vehicle  //汽車
{
public:
    void run() const
    {
        cout << "run a car. "<<endl;
    }
};
class Airplane: public Vehicle  //飛機
{
public:
    void run() const
    {
        cout << "run a airplane. "<<endl;
    }
};
int main()
{
    cout<<"(a) 直接用對象訪問成員函數: "<<endl;
    Vehicle v;
    v.run();
    Car car;
    Airplane airplane;
    car.run();
    airplane.run();
    cout<<"(b)用指向基類的指針訪問成員函數: "<<endl;
    Vehicle *vp;    //建立一個基類的指針
    vp=&car;        //對car對象取地址
    vp->run();
    vp=&airplane;   //對airplan對象取地址
    vp->run();
    return 0;
}


(1)請寫出程序的執行結果,並在上機時對照理解

請回答:當基類的指針指向派生類時,用指針調用同名成員函數,執行的是基類的成員函數,還是派生類的成員函數?爲什麼會這樣?


在繼承關係中直接用對象訪問不同類的同名成員函數是可以的。

但是用指向基類的指針訪問的時候,基類指針是無法訪問派生類中非繼承的成員函數和數據成員的。所以輸出的結果仍然是繼承而來的基類的成員函數,輸出

run a vehicle.

run a vehicle.


(2)如果將Vehicle類的定義修改爲虛函數,其餘不變,請寫出程序的執行結果

請回答:當基類的指針指向派生類時,用指針調用同名虛成員函數,執行的是基類的成員函數,還是派生類的成員函數?爲什麼會這樣?什麼是多態性?請結合本例的運行結果說明


將基類同名函數設置爲虛函數,則在派生類中的同名函數就會相當於覆蓋掉了基類中的虛函數,所以指向基類的指針可以理所當然的可以指向派生類的成員函數,輸出

run a car.

run a aieplane.

這正是體現了動態多態性。


(3)如果將Vehicle類的定義修改爲純虛函數,找出main()函數中將使編譯出錯的行刪除(或改爲註釋),請寫出程序的執行結果,並在上機時對照理解

virtual void run() const = 0; //(3) run()爲純虛函數,const意指其爲常成員函數,並非純虛函數之必要

請回答:當基類同名成員函數定義爲純虛函數後,發生了什麼現象?爲什麼會這樣?


含有純虛函數的類,變成了虛基類,而在虛基類是不能定義對象的。


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