C02-程序设计基础提高班(C++)第13周上机任务-多态与虚函数

第13周:阅读教材第12章(p395-416),主要内容是多态性,完成第13周上机任务

(回到C02-程序设计基础提高班(C++)学习安排)

【任务1】下面给出了基类Animal和main()函数。
(1)根据main()函数给出的注释提示,设计出相关的各个类。
(2)显然,Animal设计为抽象类更合适,Animal不需要能够实例化,是专门作基类使用的。改造程序,使Animal设计为抽象类,这时main()函数中p = new Animal();将出错,将此行删除。
(3)每一个Animal的派生类都有一个“名字”数据成员,改造上面的程序,将这一数据成员作为抽象类Animal数据成员被各派生类使用。

#include <iostream>
#include<string>
using namespace std;
class Animal
{
public:
	virtual void cry() {cout<<"不知哪种动物,让我如何学叫?"<<endl;}
};

int main( )
{
	Animal *p;
	p = new Animal(); p->cry(); //输出: 不知哪种动物,让我如何学叫?(问题出自此处)
	Mouse m1("Jerry"); p=&m1; p->cry(); //输出: 我叫Jerry,是一只老鼠,我的叫声是:吱吱吱!
	Mouse m2("Limy"); p=&m2; p->cry(); //输出: 我叫Limy,是一只老鼠,我的叫声是:吱吱吱!
	Cat c("Tom");  p=&c; p->cry(); //输出: 我叫Tom,是一只猫,我的叫声是:喵喵喵!
	Dog d1("Droopy");  p=&d1; p->cry(); //输出: 我叫Droopy,是一条狗,我的叫声是:汪汪汪!
	Dog d2("Drooby");  p=&d2; p->cry(); //输出: 我叫Drooby,是一条狗,我的叫声是:汪汪汪!
	Giraffe g("Gill");  p=&g; p->cry(); //输出: 我叫Gill,是长颈鹿,脖子太长,发不出声音来!
	system("pause");
	return 0;
}

[ 参考:动物怎么叫?——好玩中理解抽象类 - http://blog.csdn.net/sxhelijian/article/details/7566457 ]

【任务2】写一个程序,定义抽象基类Shape,由它派生出3个派生类,Circle(圆形)、Rectangle(矩形)、Triangle(三角形)。用如下的mian()函数,求出定义的几个几何体的面积和。

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;   //输出总面积
	system("pause");
	return 0;
}

[ 参考:抽象基类Shape及派生类Circle、Rectangle和Triangle - http://blog.csdn.net/sxhelijian/article/details/7566500 ]

【任务3】设计一个抽象类CSolid,含有两个求表面积及体积的纯虚函数。设计个派生类CCube、CBall、CCylinder,分别表示正方体、球体及圆柱体。在main()函数中,定义基类的指针p(CSolid *p;),利用p指针,输出正方体、球体及圆柱体对象的表面积及体积。

[ 参考:抽象类CSolid及派生类CCube、CBall、CCylinder - http://blog.csdn.net/sxhelijian/article/details/7566545 ]

时间: 2024-08-17 13:56:51

C02-程序设计基础提高班(C++)第13周上机任务-多态与虚函数的相关文章

C02-程序设计基础提高班(C++)第10周上机任务-类和对象之二

第10周:阅读教材第9章(p263-313),主要内容是构造和析构函数.对象数组.对象指针.共用数据的保护等,完成第10周上机任务: (回到C02-程序设计基础提高班(C++)学习安排) 实践任务: [任务1]设计三角形类,通过增加构造函数,使对象在定义时能够进行初始化 #include<iostream> using namespace std; class Triangle {public: float perimeter(void);//计算三角形的周长 float area(void)

C02-程序设计基础提高班(C++)第8周上机任务-结构体

第8周:阅读教材第7章(p201-230),主要内容是结构体与自定义类型,同时也希望将同学们将第3-7章的内容整理一下,完成第8周上机任务,本周任务将增加一些对用结构化程序设计技术解决问题的综合性题目: (回到C02-程序设计基础提高班(C++)学习安排) 实践任务(需要的数据文件score.txt在本文后,自行复制后,用记事本保存为score.txt): [任务1]结构体数据组 score.txt中是一些同学的学号.姓名.C++.高数.英语成绩,定义一个学生成绩的结构体数组,其中的成员包括学号

C02-程序设计基础提高班(C++)第14周上机任务-文件操作

第14周:阅读教材第13章(p417-458),主要内容是输入输出,重点是文件的操作,完成第14周上机任务: (回到C02-程序设计基础提高班(C++)学习安排) [任务1]涨工资从文件salary.txt中读入500名工人的工资,全部增加100元后进行排序,将排序后的结果在屏幕上输出,并保存到文件ordered_salary.txt中.[ 参考:涨工资了 - http://blog.csdn.net/sxhelijian/article/details/7632245 ] [任务2]学生成绩排

C02-程序设计基础提高班(C++)第9周上机任务-类和对象

第9周:阅读教材第8章(p231-262),主要内容是类和对象,学会定义类和对象解决问题,完成第9周上机任务: (回到C02-程序设计基础提高班(C++)学习安排) 实践任务: [任务1]阅读.运行下面的程序后,按要求编制新的成员函数,并增加类的功能 #include <iostream> using namespace std; class Time { public: void set_time( ); void show_time( ); private: bool is_time(in

C02-程序设计基础提高班(C++)第11周上机任务-运算符重载

第11周:阅读教材第10章(p314-346),掌握用运算符重载解决问题,完成第11周上机任务: (回到C02-程序设计基础提高班(C++)学习安排) [任务1]实现复数类中的运算符重载定义一个复数类重载运算符+.-.*./,使之能用于复数的加减乘除.(1)方案一:请用类的成员函数完成运算符的重载: class Complex { public: Complex(){real=0;imag=0;} Complex(double r,double i){real=r;imag=i;} Comple

C02-程序设计基础提高班(C++)第6周上机任务-数组

第6周:阅读教材第5章(p134-163),主要内容是数组,完成第6周上机任务: (回到C02-程序设计基础提高班(C++)学习安排) 任务内容: 1. 创建一个长度为20的数组,其中存放斐波那契数列的前20项. 2. 筛法求素数.筛法求素数是一种快速的求素数的方法,其思路是以空间换时间,利用额外的数组作为中介,能够显著降低运行的时间.现在要求列出10000以内的素数. (筛法求素数的算法请上网查找) 3. 在数组score中将要存储某小组C++程序设计的成绩,请设计完成下面功能函数,并将它们组

C02-程序设计基础提高班(C++)第5周上机任务

第5周:阅读教材第4章(p88-133),主要内容是函数 (回到C02-程序设计基础提高班(C++)学习安排) 1. 求满足条件n=a!+b!+c!的所有三位数n并输出,要求用自定义函数实现求阶乘. 参考程序: #include <iostream> using namespace std; long fac(int n); //函数的声明 //下面定义main()函数完成任务,其中求阶乘的工作调用fac()函数完成 //下面定义fac(),实现求阶乘的功能 2. 编制一个返回值为bool型的

C02-程序设计基础提高班(C++)第7周上机任务-指针

第7周:阅读教材第6章(p164-200),主要内容是指针,完成第7周上机任务: (回到C02-程序设计基础提高班(C++)学习安排) 实践内容: 1. (数组的排序) 按模板中的要求,用指向数组的指针变量作为形式参数编写函数,完成冒泡排序.重点体会:(1)冒泡排序算法:(2)用指向数组的指针变量作为形式参数,用数组名(即数组的地址)作为实际参数,函数中对于形参的改变实质上也就是对实参对应内存单元的改变:(3)形式参数中不指定数组大小,实际数组的大小也一并作为参数传递. #include <io

C02-程序设计基础提高班(C++)第4周上机任务

第4周:下载并阅读 C++程序设计入门同步实践宝典(v0.5)中的1.2节及第3章的内容(下载积分不足的同学可以通过校园网到我的BB平台下载,账号2009helijian),在程序调试技术.解题方法方面加深理解 (回到C02-程序设计基础提高班(C++)学习安排) 1.分别用3种循环(while~.for(;;)~.do~while)计算下式 要求用单重循环完成,以强化关注效率的意识. 2.在下面的加法算式中,不同的符号代表不同的数字,相同的符号代表相同的数字.请设计程序求出"都.要.学.C&q