問題及代碼:
#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;
}
請回答:當基類的指針指向派生類時,用指針調用同名成員函數,執行的是基類的成員函數,還是派生類的成員函數?爲什麼會這樣?
在繼承關係中直接用對象訪問不同類的同名成員函數是可以的。
但是用指向基類的指針訪問的時候,基類指針是無法訪問派生類中非繼承的成員函數和數據成員的。所以輸出的結果仍然是繼承而來的基類的成員函數,輸出
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意指其爲常成員函數,並非純虛函數之必要
請回答:當基類同名成員函數定義爲純虛函數後,發生了什麼現象?爲什麼會這樣?
含有純虛函數的類,變成了虛基類,而在虛基類是不能定義對象的。