(任務1.1)請寫出程序的執行結果,並在上機時對照理解
#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;
Car car;
Airplane airplane;
car.run();
airplane.run();
cout << "(b)用指向基類的指針訪問成員函數:" << endl;
Vehicle *vp;
vp = &car;
vp ->run();
vp = &airplane;
vp ->run();
}
(任務1.2)如果將Vehicle類的定義修改爲虛函數,其餘不變,請寫出程序的執行結果,並在上機時對照理解
#include <iostream>
using namespace std;
class Vehicle
{
public:
virtual 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;
Car car;
Airplane airplane;
car.run();
airplane.run();
cout << "(b)用指向基類的指針訪問成員函數:" << endl;
Vehicle *vp;
vp = &car;
vp ->run();
vp = &airplane;
vp ->run();
}
(任務1.3)如果將Vehicle類的定義修改爲純虛函數,找出main()函數中將使編譯出錯的行刪除(或改爲註釋),請寫出程序的執行結果,並在上機時對照理解
#include <iostream>
using namespace std;
class Vehicle
{
public:
virtual void run() const = 0;
};
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;
Car car;
Airplane airplane;
car.run();
airplane.run();
cout << "(b)用指向基類的指針訪問成員函數:" << endl;
Vehicle *vp;
vp = &car;
vp ->run();
vp = &airplane;
vp ->run();
}
感悟:開始的第一個程序沒有運用盡管想調用使其輸出car,airplane,但是無法調用只能調用基類的輸出vehicle使用虛函數,允許在派生類中重新定義與基類同名的函數,並且可以通過基類指針或引用來訪問基類和派生類中的同名函數,多態性是指具有不同功能的函數可以用一個函數名調用不同內容的函數。