第十三周【任务一】抽象类,虚函数,多态性。

【目的】
1. 进一步多态性的基本概念
2. 学会利用虚函数实现多态性
3. 学会在设计中利用纯虚函数构造抽象基类

【任务1】阅读下面的程序
(任务1.1)请写出程序的执行结果,并在上机时对照理解
#include <iostream>
using namespace std;

class Vehicle
{
public:
 void run() const { cout << "run a vehicle. "<<endl; } //(2) run()为虚函数
};

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;
 vp->run();
 vp=&airplane;
 vp->run();
 system("pause");
 return 0;
}
(任务1.2)如果将Vehicle类的定义修改为虚函数,其余不变,请写出程序的执行结果,并在上机时对照理解
class Vehicle
{public:
 virtual void run() const { cout << "run a vehicle. "<<endl; } //(2) run()为虚函数
};
(任务1.3)如果将Vehicle类的定义修改为纯虚函数,找出main()函数中将使编译出错的行删除(或改为注释),请写出程序的执行结果,并在上机时对照理解
class Vehicle
{public:
 virtual void run() const = 0; //(3) run()为纯虚函数
};
(任务1.4)提交博文,记录实验过程和结果,用自己的话概括你对虚函数、多态性和抽象类的理解。

 

#include <iostream> 
using namespace std;

class Vehicle 
{
public: 
 void run() const { cout << "run a vehicle. "<<endl; } //(2) run()为虚函数
}; 

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;
 vp->run();
 vp=&airplane;
 vp->run();
 system("pause");
 return 0;
} 


第十三周【任务一】抽象类,虚函数,多态性。_第1张图片

 

 

第十三周【任务一】抽象类,虚函数,多态性。_第2张图片

 

 

去掉Vehicle v;
 v.run();

 

第十三周【任务一】抽象类,虚函数,多态性。_第3张图片

 

 

 

积累经验:

(1)基类不能访问派生类中的信息。因此其输出结果应为 基类的部分。抽象类的作用是作为一个类族的共同基类。

(2)当改为虚函数,其就可实现动态的多态性。通过指向基类的指针访问派生类中同名的成员函数,实现不同功能。

(3)抽象类不能实例化,即不能建立对象。还有纯虚函数是不能被调用的。所以要删除那两行

 

 

你可能感兴趣的:(System,Class,任务,iostream)