C++程序设计-第14周 多态性与虚函数
来源:互联网 发布:php获取上上个文件夹名 编辑:程序博客网 时间:2024/06/08 01:54
课程首页地址:http://blog.csdn.net/sxhelijian/article/details/7910565
【目的】
1. 掌握多态性的基本概念
2. 学会利用虚函数实现多态性
3. 学会在设计中利用纯虚函数构造抽象基类
第一部分 阅读程序
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; 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(); return 0;}请回答:当基类的指针指向派生类时,用指针调用同名成员函数,执行的是基类的成员函数,还是派生类的成员函数?为什么会这样?
(2)如果将Vehicle类的定义修改为虚函数,其余不变,请写出程序的执行结果,并在上机时对照理解
class Vehicle {public: virtual void run() const { cout << "run a vehicle. "<<endl; } //(2) run()为虚函数};请回答:当基类的指针指向派生类时,用指针调用同名虚成员函数,执行的是基类的成员函数,还是派生类的成员函数?为什么会这样?什么是多态性?请结合本例的运行结果说明。
(3)如果将Vehicle类的定义修改为纯虚函数,找出main()函数中将使编译出错的行删除(或改为注释),请写出程序的执行结果,并在上机时对照理解
class Vehicle {public: virtual void run() const = 0; //(3) run()为纯虚函数};请回答:当基类同名成员函数定义为纯虚函数后,发生了什么现象?为什么会这样?
(4)提交博文,记录实验过程和结果,用自己的话回答上面提出的问题,概括你对虚函数、多态性和抽象类的理解。——不要忽视回答问题,写出来,你会更明白。
2、阅读下面的程序,并写出运行结果
(1)
#include <iostream>using namespace std;class BASE{private: char c;public: BASE(char n):c(n) {} virtual ~BASE() { cout<<c; }};class DERIVED:public BASE{private: char c;public: DERIVED(char n):BASE(n+1),c(n) {} ~DERIVED() { cout<<c; }};int main(){ DERIVED d('X'); return 0;}(2)
#include <iostream>using namespace std;class Mammal{public: Mammal( ) { cout<<"Mammal constructor called."<<endl; } virtual ~Mammal() { cout<<"Mammal destructor called."<<endl; } virtual void Speak() const { cout<<"Mammal speak."<<endl; }};class Dog : public Mammal{public: Dog() { cout<<"Dog constructor called."<<endl; } ~Dog() { cout<<"Dog destructor called."<<endl; } void Speak() const { cout<<"Woof!"<<endl; }};int main(){ Mammal *p=new Dog; p->Speak(); delete p; return 0;}
第二部分 实践项目
【项目1】根据给出的基类Animal和main()函数。
1、根据给出的main()函数和运行结果的提示,设计出相关的各个类,注意观察运行结果,提取出每个类中需要的数据成员,并匹配上需要的成员函数。
2、显然,Animal设计为抽象类更合适,Animal不需要能够实例化,是专门作基类使用的。改造程序,使Animal设计为抽象类,这时main()函数中p = new Animal();将出错,将此行删除。
3、每一个Animal的派生类都有一个“名字”数据成员,这一共有的成员完全可以由基类提供改造上面的程序,将这一数据成员作为抽象类Animal数据成员被各派生类使用。
下面是给出的基类Animal和main()函数:
class Animal{public: virtual void cry() { cout<<"不知哪种动物,让我如何学叫?"<<endl; }};int main( ){ Animal *p; p = new Animal(); p->cry(); Mouse m1("Jerry",'m'); p=&m1; p->cry(); Mouse m2("Jemmy",'f'); p=&m2; p->cry(); Cat c1("Tom"); p=&c1; p->cry(); Dog d1("Droopy"); p=&d1; p->cry(); Giraffe g1("Gill",'m'); p=&g1; p->cry(); return 0;}下面是程序的运行结果:
【项目2】写一个程序,定义抽象基类Shape,由它派生出3个派生类,Circle(圆形)、Rectangle(矩形)、Triangle(三角形)。用如下的main()函数,求出定义的几个几何体的面积和。
int main(){ Circle c1(12.6),c2(4.9);//建立Circle类对象c1,c2,参数为圆半径 Rectangle r1(4.5,8.4),r2(5.0,2.5);//建立Rectangle类对象r1,r2,参数为矩形长、宽 Triangle t1(4.5,8.4),t2(3.4,2.8); //建立Triangle类对象t1,t2,参数为三角形底边长与高 Shape *pt[6]= {&c1,&c2,&r1,&r2,&t1,&t2}; //定义基类指针数组pt,使它每一个元素指向一个派生类对象 double areas=0.0; //areas为总面积 for(int i=0; i<6; i++) { areas=areas + pt[i]->area(); } cout<<"totol of all areas="<<areas<<endl; //输出总面积 return 0;}
【项目3】设计一个抽象类CSolid,含有两个求表面积及体积的纯虚函数。设计个派生类CCube、CBall、CCylinder,分别表示正方体、球体及圆柱体。在main()函数中,定义基类的指针p(CSolid *p;),利用p指针,输出正方体、球体及圆柱体对象的表面积及体积。
- C++程序设计-第14周 多态性与虚函数
- 谭浩强C++程序设计第12章多态性与虚函数
- c++--多态性与虚函数
- [C++] 多态性与虚函数
- 第13周多态性与虚函数程序阅读
- 第8章--多态性与虚函数
- C/C++中多态性与虚函数
- C++__多态性与虚函数
- C++程序设计学习之『多态性与虚函数』
- 读书笔记--C++程序设计(第2版)--12多态性与虚函数(虚析构函数,纯虚函数与抽象类)
- 多态性与虚函数
- 多态性与虚函数
- 多态性与虚函数
- 多态性与虚函数
- 多态性与虚函数
- 虚函数与多态性
- 多态性与虚函数
- 多态性与虚函数
- 存在bug<java.lang.NoSuchFieldException: DEFAULT_PARAM>
- CSharp Algorithm - Recursive method (Iterate all directories and files in a directory)
- gunzip 和 unzip 解压文件到指定的目录
- DM3730 Camera 接口调试笔记
- camera isp
- C++程序设计-第14周 多态性与虚函数
- OMAP3530 CAMERA ISP API
- oracle创建数据表,修改,删除数据表
- Java 目录重命名
- J2EE、J2SE、J2ME是什么意思?
- Android官网培训:管理位图内存
- Toward Good Thinking On Essential Questions(值得我们思考的一篇文章)
- 新的一天
- chapter7 取消与关闭1