第十三周作业任务1我对虚函数、抽象类和多态性的理解

任务1.1
 
/* (程序头部注释开始)
* 程序的版权和版本声明部分
* Copyright (c) 2011, 烟台大学计算机学院学生 
* All rights reserved.
* 文件名称:我对虚函数、多态性和抽象类的理解

* 作    者:         张馨                      
* 完成日期:     2012    年 05     月  14   日
* 版 本 号:       V1.0   
* 对任务及求解方法的描述部分
* 输入描述: 
* 问题描述:1. 进一步多态性的基本概念2. 学会利用虚函数实现多态性3. 学会在设计中利用纯虚函数构造抽象基类 
* 程序输出: 


* 程序头部的注释结束

*/
#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;
}  
运行结果:


 

(a) 直接用对象访问成员函数:
run a vehicle.
run a car.
run a airplane.
(b) 用指向基类的指针访问成员函数:
run a vehicle.
run a vehicle.
请按任意键继续. . .
任务1.2

#include <iostream>
using namespace std;
class Vehicle  
{public:  
 virtual 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;
}  


运行结果:

(a) 直接用对象访问成员函数:
run a vehicle.
run a car.
run a airplane.
(b) 用指向基类的指针访问成员函数:
run a car.
run a airplane.
请按任意键继续. . .

任务1.3

#include <iostream>
using namespace std;
class Vehicle  
{public:  
 virtual void run() const =0;//(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>d:\visual studio 2008\projects\text\text\text.cpp(17) : error C2259: “Vehicle”: 不能实例化抽象类
1>        由于下列成员:
1>        “void Vehicle::run(void) const”: 是抽象的

 

删除错误之后:

#include <iostream>
using namespace std;
class Vehicle  
{public:  
 virtual void run() const =0;//(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;
}  


运行结果:

(a) 直接用对象访问成员函数:
run a car.
run a airplane.
(b) 用指向基类的指针访问成员函数:
run a car.
run a airplane.
请按任意键继续. . .

总结:

①、任务1.1和任务1.2比较:任务1.2在基类中使用了虚函数,这样可以指向基类的指针灵活访问派生类中同名的成员函数,使程序易于理解易于读取。

②任务1.3中,纯虚函数不能被调用,纯虚函数的类不能建立对象。

③、抽象类的作用是最为一个类族的共同基类。

④、动态多态性是通过虚函数(virtual function)来实现的,通过基类的指针来灵活访问派生类中同名的成员函数,实现不同的功能

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
虚函数是在基类中声明的虚函数,它在派生类中被重新定义,可以通过基类指针或引用来调用派生类中的这个函数。虚函数的作用是实现多态性,即同一个函数在不同的对象中有不同的实现。下面是一个虚函数的例子: ```c++ #include <iostream> using namespace std; class Shape { protected: int width, height; public: Shape( int a = 0, int b = 0) { width = a; height = b; } virtual int area() { cout << "Parent class area :" <<endl; return 0; } }; class Rectangle: public Shape { public: Rectangle( int a = 0, int b = 0):Shape(a, b) { } int area () { cout << "Rectangle class area :" <<endl; return (width * height); } }; int main() { Shape *shape; Rectangle rec(10,7); shape = &rec; shape->area(); return 0; } ``` 抽象类是不能被实例化的类,它的存在是为了让其他类去继承它并实现它的纯虚函数。纯虚函数是在基类中声明的虚函数,但是没有实现,它的实现留给该基类的派生类去做。下面是一个抽象类的例子: ```c++ #include <iostream> using namespace std; class Shape { protected: int width, height; public: Shape( int a = 0, int b = 0) { width = a; height = b; } virtual int area() = 0; }; class Rectangle: public Shape { public: Rectangle( int a = 0, int b = 0):Shape(a, b) { } int area () { cout << "Rectangle class area :" <<endl; return (width * height); } }; int main() { Shape *shape; Rectangle rec(10,7); shape = &rec; shape->area(); return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值