定义一个抽象类Shape,并派生出类Rectangel和Circle,二者都有计算面积的函数getArea,在主函数中定义一个Shape指针数组分别指向Rectangel和Circle的对象,并通过Shape类的指针数组实现对这两个对象的成员函数的调用,以输出圆和矩形的面积。
定义一个抽象类Shape,并派生出类Rectangel和Circle,二者都有计算面积的函数getArea,在主函数中定义一个Shape指针数组分别指向Rectangel和Circle的对象,并通过Shape类的指针数组实现对这两个对象的成员函数的调用,以输出圆和矩形的面积。
参考答案和解析
#include class Shape {public:virtual double area()const=0; };class Square:public Shape{public:Square(double s):side(s){}double area() const{return side*side;}private:double side;};class Trapezoid:public Shape{public:Trapezoid(double i,double j,double k):a(i),b(j),h(k){}double area() const{return ((a+b)*h/2);}private:double a,b,h;};class Triangle:public Shape{public:Triangle(double i,double j):w(i),h(j){}double area() const{return(w*h/2);}private:double w,h;};void main(){Shape *p[5];Square se(5);Trapezoid td(2,5,4);Triangle te(5,8);p[0]=&se;p[1]=&td;p[2]=&te;double da=0;for(int i=0;i{da+=p[i]->area();}cout
相关考题:
( 12 ) “ 图形 ” 类 Shape 中定义了纯虚函数 CalArea() ,“ 三角形 ” 类 Triangle 继承了类Shape ,请 将Triangle 类中的 CalArea 函数补充完整。class Shape{public:virtual int CalArea()=0;}class Triangle: public Shape{public:Triangle{int s, int h}: side(s),height(h) {}【 12 】 { return side*height/2 ; }private:int side;int height;};
( 32 )下面是类 Shape 的定义:class Shape{public:virtual void Draw()=0;};下列关于 Shape 类的描述中,正确的是A )类 Shape 是虚基类B )类 Shape 是抽象类C )类 Shape 中的 Draw 函数声明有误D )语句 “ Shape s; ” 能够建立 Shape 的一个对象 s
下面是类Shape的定义: class Shape{ public: virtual void Draw()=0; } 下列关于Shape类的描述中,正确的是( )。A.类Shape是虚基类B.类Shape是抽象类C.类Shape中的Draw函数声明有误D.语句“Shape s;”能够建立Shape的一个对象s
阅读以下说明和C++代码,填入(n)处。[说明]以下C++代码使用虚函数实现了同一基类shape派生出来的Class rectangle、Class triangle、Class circle实现了计算矩形、圆形面积的计算。仔细阅读以下代码,将(n)处语句补充完整。[代码5-1]include<iostream.h>define PI 3.14159class shape {//基类protected:(1);public:(2);(3);};[代码5-2]class rectangle: public shape {public:rectangle (int x2,int y2,int r2): (4) {};double area ( ) {return x*y; };};class circle: public shape {public:circle (int x3,int y3,int r3):(5){};double area ( ) {return r*r*PI; };};[代码5-3]void main ( ){rectangle r (10,20,0);circle c (0,0,30);shape (6);cout<<"长方形面积="<<s1->area ( ) <<endl;cout<<"圆形面积="<<s2->area ( ) <<endl;}[运行结果]长方形面积=200圆形面积=2827.43
下面关于this指针的说法中,不正确的是( )。A.当调用类的成员函数时,指针this被自动传递给该成员函数B.当调用类的成员函数时,指针this实际上指向了该类的一个对象C.友元函数也可以被传递指针thisD.在缺省状态下,所有的成员函数都自动传递一个指针给激活它的对象
阅读以下说明和C代码,将应填入(n)处的字句写在的对应栏内。【说明】在一个简化的绘图程序中,支持的图形种类有点(point)和圆(circle),在设计过程中采用面向对象思想,认为所有的点和圆都是一种图形(shape),并定义了类型shape t、 point t和circle t分别表示基本图形、点和圆,并且点和圆具有基本图形的所有特征。【C代码】typedef enum { point,circle } shape type; /* 程序中的两种图形:点和圆 */typedef struct { /* 基本的图形类型 */shape_type type; /* 图形中类标识:点或者圆*/void (*destroy) (); /* 销毁图形操作的函数指针*/void (*draw) (); /* 绘制图形操作的函数指针*/} shape_t;typedef struct { shape_t common; int x; iht y; } point_t; /* 定义点类型, x, y为点坐标*/void destroyPoint (point_t* this) { free (this); printf ("Point destoryed!\n"); } ) /* 销毁点对象*/void drawPoint(point_t* this) { printf("P(%d,%d)", this-x, this-y); }/* 绘制点对象*/shape_t* createPoint (va_list* ap) (/* 创建点对象,并设置其属性*/point_t* p_point;if ( (p_point= (point_t*)malloc (sizeof (point_t)) ) ==NULL) returnNULL;p_point->common, type = point; p_point-common, destroy = destroyPoint;p_point->common.draw = drawPoint;p_point->x = va_arg(*ap, int); /* 设置点的横坐标*/p_point->y = va_arg(*ap, int); /* 设置点的纵坐标*/return (shape_t*)p_ooint; /*返回点对象指针*/}typedef struct { /*定义圆类型*/shape_t common;point_t 4center; /*圆心点*/int radius; /*圆半径*/} circle_t;void destroyCircle(circle_t* this){free((1)); free(this); printf("Circle destoryed!\n");}void drawCircle(circle_t* this) {print f ("C (");(2).draw(this->center); /*绘制圆心*/printf(",%d) ", this->radius);}shape_t* createCircle(va_list4 ap) { /*创建一个圆,并设置其属性*/circle_t4 p circle;if ((p_circle = (circle_t4)malloc (sizeof (circle_t)) ) ==NULL ) return NULL;p_circle->common.type = circle; p_circle->common.destroy = destroyCircle;p_circle->common.draw = drawCircle;(3) = createPoint(ap); /* 设置圆心*/p_circle->radius = va_arg(*ap, int); /* 设置圆半径*/return p_circle;}shape_t* createShape(shape_type st, "') { /* 创建某一种具体的图形*/va_list ap; /*可变参数列表*/&nbs
若有如下类定义:class Shape {public:virtual void Draw()=0;};则下列关于Shape类的叙述中,正确的是( )。 A. 类Shape是虚基类B.类Shape是抽象类C.类Shape中的Draw函数声明有误D.“Shape s;”能建立Shape的对象s
关于抽象类,下列表述正确的是( )。A.抽象类的成员函数中至少有一个是没有实现的函数(即无函数体定义的函数)B.派生类必须实现作为基类的抽象类中的纯虚函数C.派生类不可能成为抽象型D.抽象类不能用来定义对象
说明语句int*(*p)();的含义是______。A.p是一个指向int型数组的指针B.p是指针变量,它构成了指针数组C.p是一个指向函数的指针,该函数的返回值是一个整型D.p是一个指向函数的指针,该函数的返回值是一个指向整型的指针
关于抽象类的说法,不正确的是( )。A.如果一个类至少有一个纯虚函数,则此类即为抽向类B.抽象类中的纯虚函数没有定义,不能建立它的对象,只能派生其子类C.抽象类对象不能用作参数类型、函数返回类型及显式转换类型D.不可声明指向抽象类的指针和引用
阅读以下说明和C++代码,将应填入(n)处的字句写上。[说明]现有一个显示系统,要显示的图形有线Line、矩形Square,抽象出一个Shape类(接口),有方法显不display()。需要新增图形Circle,又已知有类XXCircle实现了所需要实现的功能:显示displayIt()。为了继承自shape以提供统一接口,又不希望从头开发代码,希望使用XXCircle。这样将XXcircle作为Circle的一个属性,即Circle的对象包含一个XXCircle对象。当一个Circle对象被实例化时,它必须实例化一个相应的XXCircle对象: Circle对象收到的做任何事的请求都将转发给这个XXCircle对象。通过这种称为Adapter模式,Circle对象就可以通过“让XXCircle做实际工作”来表现自己的行为了。图6-1显示了各个类间的关系。以下是C++语言实现,能够正确编译通过。[图6-1][C++代码]class Shape{public:(1) void display()=0;};class Line:public Shape{//省略具体实现};class Square:public Shape{//省略具体实现};class XXCircle{public:void displayIt(){//省略具体实现}//省略其余方法和属性};class Circle:public Shape{private:XXCircle *pxc;public:Circle();void display();};Circle::Circle(){pxc=(2);}void Circle::display(){pxc->(3);}class Factory{public:(4) getshapeInstance(int type){//生成特定类实例switch(type){case 1:return new Square;case 2:return new Line;case 3 :return new Circle;default:return NULL;}}};void main(int argc,char*argv[]){if(argc !=2){cout<<"error parameters!"<<endl;return;}int type=atoi(argv[1]);Factory factory;Shape*s=factory. (5);if(s==NULL){cout<<"Error get the instance!"<<endl;return;}s->display();delete s;return;}(1)
下面是类Shape的定义: classShape{ public: virtualvoidDraw( )=0; } 下列关于Shape类的描述中,正确的是( )。A.类Shape是虚基类B.类Shape是抽象类C.类Shape中的Draw函数声明有误D.语句“ShapeS;”能够建立Shape的一个对象S
若有如下定义: int (*p)(), *q(); 则下列说法正确的是( )A.p是一个函数名,q是一个指针变量B.p是一个指向整型变量的指针变量,q是一个指向一维数组的指针变量C.p和q是等价的,都是指针变量D.p是指向函数的指针变量,函数的返回值是整型数据;q是带回指针值的函数
设有定义:int(* ptr)( ); 则以下叙述中正确的是 ( )A.ptr是指向一维数组的指针变量B.ptr是指向int型数据的指针变量C.ptr是指向函数的指针,该函数返回一个int数据D.prt是一个函数名,该函数的返回值是指向int型数据的指针
当基类指针指向派生类对象时,会发生()A、错误,基类指针不能指向派生类对象B、基类指针可以指向派生类对象,但在此情况下只能调用基类自己定义的成员函数C、基类指针可以调用派生类的成员函数D、以上说法全部错误
当设置了容器对象的DrawWidth属性后,会影响()A、Pset、Line、Circle方法B、Line、Shape控件C、Pset、Line、Circle方法和Line、Shape控件D、Line、Circle、point方法
单选题关于图3.19的叙述()是不正确的。A Rectangle类和Circle类都有名为area的属性,这两个属性一定是相同的属性B Rectangle类和Circle类都有名为getArea的操作,这两个操作一定是相同的操作C Rectangle中名为length的属性和Circle类中名为radius的属性,这两个属性一定是不同的属性D Shape类有一个属性,Circle类有两个属性,Rectangle类有三个属性
单选题当基类指针指向派生类对象时,会发生()A错误,基类指针不能指向派生类对象B基类指针可以指向派生类对象,但在此情况下只能调用基类自己定义的成员函数C基类指针可以调用派生类的成员函数D以上说法全部错误
单选题当基类指针指向派生类对象时,利用基类指针调用派生类中与基类同名但被派生类重写后的成员函数时,调用的是()A基类的成员函数B派生类的成员函数C不确定D先调用基类的,再调用派生类的