实验十多态性—虚函数的应用 - 参考答案
实验十多态性—虚函数的应用10.1 实验目的
1.理解和掌握虚函数的作用;
2.掌握利用虚函数实现C++的运行时多态性;
3.理解纯虚类和抽象类。
10.2 实验内容
10.2.1程序阅读
1.理解下面的程序,并运行查看结果,回答程序后面的问题。
#include
using namespace std;
class Point
{
public:
Point(double i,double j)
{
x=i;
y=j;
}
double Area() const{return 0;}
private:
double x,y;
};
class Circle:public Point
{
public:
Circle(double i,double j,double k);
double Area() const {return 3.14*r*r;}
private:
double r;
};
Circle::Circle(double i,double j,double k):Point(i,j)
{
r=k;
}
void fun(Point &s)
{
cout< } int main() { Circle rec(3.0,5.2,15.0); fun(rec); //…………………………………………① return 0; } 问题一:请解释①处函数的值传递过程。 答:派生类Circle对象rec向基类Point对象s赋值 问题二:主函数中定义了一个Circle类对象rec,并想通过调用fun函数求得rec对象的Area,请修改程序,使程序输出正确。 答:在基类Point中声明double Area() const{return 0;}为虚函数,语句如下:virtual double Area() const{return 0;} 2. 阅读下述程序,并回答程序之后的问题。 #include using namespace std; class A { public: virtual void f(void) { cout<<"f function of class A is called! \n"; } }; class B:public A { public: void f(void) { cout<< "f function of class B is called! \n"; } }; class C:public B { public: void f(void) { cout<< "f function of class C is called! \n"; } int main(void) { C objc,*p=&objc,&r=objc; cout<<"Calling f based on object...\n"; ____1____; ____2____; ____3____; cout<<"Calling f based on reference...\n"; ____4____; ____5____; ____6____; cout<<"Calling f based on pointer...\n"; ____7____; ____8____; ____9____; return 0; } 问题一:若程序输出为如下图所示,请填写1~9语句; 答:正确语句如下 cout<<"Calling f based on object...\n"; objc.f(); objc.A::f(); objc.B::f(); cout<<"Calling f based on reference...\n"; r.f(); r.A::f(); r.B::f(); cout<<"Calling f based on pointer...\n"; p->f(); p->A::f(); p->B::f(); 问题二:将主函数更改为如下程序,试解释为什么A类指针可调用B、C类的f函数?int main(void) A obja,*p; B objb; C objc; p=&obja; p->f(); p=&objb; p->f(); p=&objc; p->f(); return 0; } 答:因为f函数在A类中定义为虚函数,而虚函数可以实现多态。 10.2.2 程序设计 1.编写一个程序计算三角形、正方形和圆形的面积,要求定义出一个基类Shape,为抽象类,在其中说明一个纯虚函数area,用来求面积。另外定义派生类Triangle、Rectangle、Circle 类,派生类中重定义函数area。在主函数中测试时,利用shape类指针分别指向Triangle、Rectangle、Circle对象,并分别求这些对象的面积。 程序如下: #include using namespace std; class Shape { public: virtual float area()=0;}; class Triangle:public Shape { protected: float H,W; public: Triangle(float h,float w){H=h;W=w;} float area(){return H*W*0.5;} }; class Rectangle:public Triangle { public: Rectangle(float h,float w):Triangle(h,w){} float area(){return H*W;} }; class Circle:public Shape { public: Circle(float r){radius=r;} float area(){return radius*radius*3.14;} protected: float radius; }; int main() { Shape *s; s =new Triangle(3.0,4.0); cout<<" Triangle area is :"< s=new Rectangle(2.0,4.0); cout<<" Rectangle area is :"< s=new Circle(5.0); cout<<" Circle area is :"< return 0; } 重庆科技学院 数学实验与数学软件课程设计 课程名称:菜单与对话框设计 开课学期:_2014-2015-1 学院:__ 数理学院 开课实验室:_数学实验与建模实验室_ 学生姓名: 谭云文 专业班级: 应数13-2班 __ 学号:___ 20134432214 _ 实验十二 我们本次实验做的是菜单与对话框设计,所谓菜单与对话框的设计包括在图形用户界面中。而图形用户界面是由窗口、菜单、对话框等各种图形元素组成的用户界面。因为在这种用户界面中,用户的操作既生动形象,又方便灵活,这是它的一大特点。 在MATLAB中,基本的图形用户界面对象包含3类:用户界面控件对象、下 拉式菜单对象和快捷菜单对象,可以设计出界面友好、操作方便的图形用户界面。 其中MATLAB用户菜单对象是图形窗口的子对象,所以菜单设计总在某一个图形 窗口中进行。MATLAB的图形窗口有自己的菜单栏。为了建立用户自己的菜单系 统,可以先将图形窗口的MenuBar属性设置为none,以取消图形窗口默认的菜 单,然后再建立用户自己的菜单。对话框是用户与计算机进行信息交流的临时窗 口,在现代软件中有着广泛的应用。在软件设计时,借助于对话框可以更好地满 足用户操作需要,使用户操作更加方面灵活。为了更便捷地进行用户界面设计, MATLAB提供了图形用户界面开发环境,这使得界面设计在可视化状态进行,设计过程中变得简单直观,实现了“所见即所得”。 例1 一、实验目的 1. 掌握plot菜单的方法。 2. 掌握建立控件对象的方法。 3. 掌握对话框设计的方法。 二、实验内容 设计图1所示的菜单。 菜单条上仅有Plot菜单,其中有Sine Wave、Cosine Wave和Exit共3个命令。若选择了其中的Sine Wave命令,则将绘制出正弦曲线;若选择了其中的Cosine Wave命令,则将绘制出余弦曲线;如果选择了Exit命令,则将关闭窗口。 程序如下: screen=get(0,'ScreenSize'); W=screen(3);H=screen(4); figure('Color',[1,1,1],'position',[0.2*H,0.2*H,0.5*W,0.3*H],... 'Name','图形演示系统','NumberTitle','off','Menubar','none'); %plot hplot=uimenu(gcf,'Label','&Plot'); uimenu(hplot,'Label','Sine Wave','Call',... ['t=-pi:pi/20:pi;','plot(t,sin(t));',... 'set(hgon,''Enable'',''on'');',... 'set(hgoff,''Enable'',''on'');',... 'set(hbon,''Enable'',''on'');',... 'set(hboff,''Enable'',''on'');']); uimenu(hplot,'Label','Cosine Wave','Call',... ['t=-pi:pi/20:pi;','plot(t,cos(t));',... 'set(hgon,''Enable'',''on'');',... 'set(hgoff,''Enable'',''on'');',... 'set(hbon,''Enable'',''on'');',... 'set(hboff,''Enable'',''on'');']); uimenu(hplot,'Label','&Exit','Call','close(gcf)'); 三、运行结果 1.点击SineWave函数将出现我们所需要的图像,如图: 2点击CosineWave函数将出现我们所需要的图像,如图: 福建农林大学实验报告 实验6 多态性(一) 一、实验目的和要求 (1)掌握虚函数的定义与使用方法,进一步理解多态性的概念和分类。 (2)了解纯虚函数和抽象类的使用方法。 二、实验内容和原理 1、分析并调试下列程序,回答以下问题:(1)指出抽象类(2)指出虚函数,并说明它的作用(3)每个类的作用是什么?整个程序的作用是什么? 2、使用虚函数编写程序求球体、圆柱体和圆锥的体积,由于球体、圆柱体和圆锥都可以看做由圆继 承而来,所以可以定义圆类作为基类。在圆类中定义数据成员半径和一个求体积的虚函数。由圆类 派生出球体类、圆柱体类和圆锥类,在派生类中对圆类中的虚函数重新定义。编写一个外部函数求 各类形状的总体积。最后在main()函数中构造若干形状,并求它们的体积和。 三、实验环境 1. 硬件:PC机; 2. 软件:Windows操作系统、Visual C++ 6.0 四、算法描述及实验步骤 1、算法描述及步骤如下: (1)根据题目要求编写好程序代码并在VC环境下输入源程序。 (2)检查程序有无错误(包括语法错误和逻辑错误),有则改之。 (3)编译和连接,仔细分析编译信息,如有错误应找出原因并改正之。本题改正后的代码如下: #include 徐州工程学院数理学院数学应用软件实验报告 课程(实验序号)数学应用软件实验 1 实验地点、日期数学建模机房2011 年 2 月23 日主要仪器设备计算机 使用的软件名称Mathematica 实验类型演示性实验 验证性实验 综合性实验√设计性实验 研究性实验 班级:姓名:孙娅学号:20090402223 一、实验题目名称:函数】变量和表达式 二、实验目的: 理解变量和算式、内核与前端处理器构成的人机对话系统,了解计算的精度问题个Mathematica使用中的几个问题。熟练掌握数的表示和计算、常用数学函数,会绘制简单函数的图形。通过上机初步了解数学应用软件,Mathematica的各种界面。 三、实验内容: 练习题1 1.计算下列各式的数值: (1) Log[2,10] Log[10]/Log[2] (2) Sqrt[Pi^2+1] 1 2 (3) Log[10,3264] Log[3264]/Log[10] (4) E^E ??/2 (5) Cos[135^0] Cos[1] (6) Sin[Pi^2/2] Sin[π2/2] (7) ArcSin[1/2] π/6 (8) 200! 7886578673647905035523632139321850622951359776871732632947425332443594499634033429203042 8401198462390417721213891963883025764279024263710506192662495282993111346285727076331723 7396988943922445621451664240254033291864131227428294853277524242407573903240321257405579 sizeof计算含有虚函数的类的空间大小 当我们计算一种数据类型所占用的空间大小时,很easy,sizeof就可以解决掉。如果我们计算一个类,一个空类,或者一个含有虚函数然后又派生子类时,这时候他们所占用的内存空间是如何变化的呢?下面我们就通过代码来介绍下。 一个不含有虚函数的普通类与其派生类的内存关系 class Base { public: Base(int x):a(x) {} void print() { cout<数学实验软件
实验6 多态性(一)
数学应用软件实验报告(mathematica实验程序)1
sizeof计算含有虚函数的类的空间大小