中北大学计算机与控制工程学院实验报告课程名称面向对象程序设计学号1507084143学生姓名刘安光辅导教师韩慧妍专业网络工程实验室名称软件基础实验室实验时间2016.12.31.实验名称实验八面向对象程序设计综合练习2.实验目的(1)全面了解面向对象程序设计的设计方法;(2)对继承、虚函数、多态性有更深一步的了解;(3)学会编制结构清晰、风格良好、符合C++语言风格的C++程序。3.实验内容设计一个可在屏幕上作图(点、线矩形、圆等图形)的简单实例,要求是不必真正在屏幕上实现作图,只是有一个示意即可。例如:画一个矩形,不必真正画出矩形,只需输出一句话:Thisisarectangle!即可。要用到继承,虚函数,多态,数据的封装,构造函数的实现等等各种面向对象程序设计的特性。4.实验原理或流程图继承:通过继承机制,可以利用已有的数据类型来定义新的数据类型。所定义的新的数据类型不仅拥有新定义的成员,而且还同时拥有旧的成员。我们称已存在的用来派生新类的类为基类,又称为父类。由已存在的类派生出的新类称为派生类,又称为子类。公有继承(public)、私有继承(private)、保护继承(protected)是常用的三种继承方式。虚函数:虚函数是C++实现动态单分派子类型多态的方式。动态:在运行时决定的(相对的是静态,即在编译期决定,如函数重载、模板类的非虚函数调用)单分派:基于一个类型去选择调用哪个函数(相对于多分派,即由多个类型去选择调用哪个函数)子类型多态:以子类型-超类型关系实现多态(相对于用参数形式,如函数重载、模版参数)多态性:所谓的多态即用父类型的指针指向子类对象,然后通过父类的指针调用实际之类的成员函数,因此父类的指针具有多种形态。多态性可以简单地概括为“一个接口,多种方法”,程序在运行时才决定调用的函数,它是面向对象编程领域的核心概念。C++多态性是通过虚函数来实现的,虚函数允许子类重新定义成员函数,而子类重新定义父类的做法称为覆盖(override),或者称为重写。(这里我觉得要补充,重写的话可以有两种,直接重写成员函数和重写虚函数,只有重写了虚函数的才能算作是体现了C++多态性)而重载则是允许有多个同名的函数,而这些函数的参数列表不同,允许参数个数不同,参数类型不同,或者两者都不同。编译器会根据这些函数的不同列表,将同名的函数的名称做修饰,从而生成一些不同名称的预处理函数,来实现同名函数调用时的重载问题。但这并没有体现多态性。5.实验过程或源代码//point.h#pragmaonceclassPoint{private:intx,y;public:Point();Point(constPoint&p);Point(intx_pos,inty_pos);intgetx();intgety();};//point.cpp#includePoint.hPoint::Point(){}Point::Point(intx_pos,inty_pos){x=x_pos;y=y_pos;}Point::Point(constPoint&p){x=p.x;y=p.y;}intPoint::getx(){returnx;}intPoint::gety(){returny;}//shape.h#pragmaonceenumColorType{White,Black,Red,Green,Blue,Yellow,Magenta,Cyan};classShape{private:protected:ColorTypecolor;public:Shape(ColorTypec);virtualvoidDraw();};//shape.cpp#includeiostream#includeShape.husingnamespacestd;Shape::Shape(ColorTypec){color=c;coutThisisShape'sconstructor!endl;}voidShape::Draw(){coutDrawnotoverriddenendl;exit(1);}//line.h#includeShape.h#includePoint.hclassLine:publicShape{private:Pointhead,end;//直线首尾点public:Line(ColorTypec,Pointh,Pointe);virtualvoidDraw();};//line.cpp#includeiostream#includeLine.husingnamespacestd;Line::Line(ColorTypec,Pointh,Pointe):Shape(c){head=h;end=e;}voidLine::Draw(){coutThisisaline!endl;coutTheheadpointis(head.getx(),head.gety())endl;coutTheendpointis(end.getx(),end.gety())endl;}//circle.h#includeShape.h#includePoint.hclassCircle:publicShape{private:Pointcenter;//圆心intradius;//半径public:Circle(ColorTypec,Pointe,intr);virtualvoidDraw();};//circle.cpp#includeiostream#includeCircle.husingnamespacestd;Circle::Circle(ColorTypec,Pointe,intr):Shape(c){center=e;radius=r;}voidCircle::Draw(){coutThisisacircle!endl;coutThecenteris(center.getx(),center.gety())endl;coutTheradiusisradiusendl;}//rectangle.h#includeShape.h#includePoint.hclassRectangle:publicShape{private:Pointupperleft,lowerright;//矩形有两个点决定,左上角的点和右下角的点public:Rectangle(ColorTypec,Pointl,Pointr);voidvirtualDraw();};//rectangle.cpp#includeiostream#includeRectangle.husingnamespacestd;Rectangle::Rectangle(ColorTypec,Pointl,Pointr):Shape(c){upperleft=l;lowerright=r;}voidRectangle::Draw(){coutThisisarectangle!endl;coutTheupperleftpointis(upperleft.getx(),upperleft.gety())endl;coutThelowerrightpointis(lowerright.getx(),lowerright.gety())endl;}//picture.h#includeShape.hclasspicture{private:Shape*s[6];public:picture(Shape*s1,Shape*s2,Shape*s3,Shape*s4,Shape*s5,Shape*s6);voidpaint();};//picture.cpp#includepicture.hpicture::picture(Shape*s1,Shape*s2,Shape*s3,Shape*s4,Shape*s5,Shape*s6){s[0]=s1;s[1]=s2;s[2]=s3;s[3]=s4;s[4]=s5;s[5]=s6;}voidpicture::paint(){for(inti=0;i6;i++)s[i]-Draw();}//main.cpp#includePoint.h#includeLine.h#includeCircle.h#includeRectangle.h#includepicture.hvoidmain(){Linel1(Red,Point(1,1),Point(250,300));Linel2(White,Point(3,5),Point(100,200));Circlec1(Blue,Point(100,75),50);Circlec2(Green,Point(50,200),20);Rectangler1(Yellow,Point(10,10),Point(255,150));Rectangler2(Magenta,Point(20,30),Point(100,125));picturep(&l1,&l2,&c1,&c2,&r1,&r2);p.paint();}6.实验结论及心得