多态性与虚函数练习
1.设计一个评选优秀教师和学生的程序,其类结构如图1所示。当输入一系列教师或学生的记录后,将优秀学生及教师的姓名列出。
图1 类结构
假设运行结果如下所示:#include
#include
using namespace std;
class Base
{
public:
void getname(){ cout<<"姓名:";cin>>name;} void printname()
{ cout< virtual int isgood()=0; protected: string name; }; class Student:public Base { public: void getnum(){ cout<< "成绩:";cin>>num;} int isgood() { return num>90?1:0;} private: int num; }; class Teacher:public Base { public: void getnum() { cout<< "每年发表论文数:";cin>>num;} int isgood(){ return num>3?1:0;} 类Base void getname() void printname() 纯虚函数int ifgood()=0 string name 类student void getnum() int num 纯虚函数ifgood实现:若考试成绩大于90分,则返回1 类teachere void getnum() int num 纯虚函数ifgood实现:若一年发表论文大于3篇,则返回1 private: int num; }; int main() { Base *p[50]; Student *pstud; Teacher *ptech; char ch; int count=0; do { cout<<"Input teacher(t) or student(s):"; cin>>ch; if(ch=='s') { pstud=new Student; pstud->getname(); pstud->getnum(); p[count++]=pstud; } else if(ch=='t') { ptech=new Teacher; ptech->getname(); ptech->getnum(); p[count++]=ptech; } else cout<<"Data error!"< cout<<"continue (y/n)?"; cin>>ch; }while(ch=='y'); cout<<"优秀者的姓名:"; for(int i=0;i if(p[i]->isgood()==1) p[i]->printname(); cout< } 2.编写一个程序实现图书和杂志销售管理。当输入一系列图书和杂志销售记录后,将销售良好(图书每月售500本以上,杂志每月2500本以上)的图书和杂志名称显示出来。 图2 类结构 假设运行结果如下: #include #include using namespace std; class Base { public: virtual void gettitle()=0; void printtitle() { cout< virtual int isgood()=0; protected: string title; }; class Book:public Base { public: void gettitle() { cout<<"书名:";cin>>title;} void getsold(){ cout<< "每月销售书量:";cin>>numsold;} int isgood() { return numsold>500?1:0;} private: int numsold; }; class Journal:public Base { public: void gettitle() { cout<<"杂志名:";cin>>title;} void getsold() { cout<< "每月销售杂志量:";cin>>numsold;} int isgood(){ return numsold>2500?1:0;} private: int numsold; }; int main() { Base *p[50]; Book *pbook; Journal *pjour; char ch; int count=0; do { cout<<"Input book(b) or journal(j):"; cin>>ch; if(ch=='b') { pbook=new Book; pbook->gettitle(); pbook->getsold(); p[count++]=pbook; } else if(ch=='j') { pjour=new Journal; pjour->gettitle(); pjour->getsold(); p[count++]=pjour; } else cout<<"Data error!"< cout<<"continue (y/n)?"; cin>>ch; }while(ch=='y'); cout<<"销售良好的书或杂志:"; for(int i=0;i if(p[i]->isgood()==1) p[i]->printtitle(); cout< } 3.扩写程序: 以下程序的功能为计算正方体的表面积和体积。增加两个类Globe和Cylinder,求球体和圆柱体的表面积和体积。在基类中定义的公共数据成员radius,可作为正方体的边长、球体的半径、圆柱体的底面半径。(补充类结构图)xt03.cpp 部分程序代码: #include using namespace std; class Container { public: Container(float r) { radius=r;} float getRadius() { return radius;} virtual void containerName(){}; virtual float surface_area(){return 0;}; virtual float volume(){return 0;}; protected: float radius; }; class Cube:public Container { public: Cube(float r):Container(r){}; void containerName() { cout<<"Cube:";} float surface_area() {return 6*radius*radius;} float volume() {return radius*radius*radius;} }; int main() { Container *pt; Cube cube(3); pt=&cube; pt->containerName(); cout<<"a="< cout<<"surface_area="< cout<<"volume="< return 0; } 运行结果如下: 4.(习题6.4)写一个程序,定义抽象基类Shape,由它派生出3个派生类:Cirle(圆形)、Rectangle (矩形)、Triangle(三角形),用一个函数printArea分别输出以上三者的面积,3个图形的数据在定义对象时给定。xt04.cpp 5.(习题6.5)写一个程序,定义抽象基类Shape,由它派生出5个派生类:Cirle(圆形)、Square (正方形)、Rectangle(矩形)、Trapezoid(梯形)、Triangle(三角形)。用虚函数分别计算几种图形的面积,并求它们的和。要求用基类指针数组,使它的每一个元素指向一个派生类对象。xt05.cpp 类Base 纯虚函数void gettitle() void printtitle() 纯虚函数int ifgood()=0 string title 类Journal void getsold() int numsold 纯虚函数ifgood实现:若 每月杂志销售量大于 2500,则返回true 类Book void getsold() int numsold 纯虚函数ifgood实现:若 每月图书销售量大于 500,则返回1.