C++题目 抽象类不是很了解

来源:百度知道 编辑:UC知道 时间:2024/05/29 01:50:00
生成一个Object抽象类,在其中声明double CalArea()为纯虚函数,从Object派生出:
Rect类(其中包含成员变量Point topleft,Point bottomright。其中Point为其子对象)、
Circle类(其中包含成员变量Point cc,double radius ),实现如下功能:
void main()
{Object *obj[2];
obj[0]=new Rect(Point(0,0),Point(100,200));
obj[1]=new Circle(Point(100,200),100.0);
int i;
for (i=0;i<2;i++)
{cout<<"the area is "<<obj[i]->calarea()<<endl;
}
}

抽象类的意思就是类有个成员函数中有至少一个纯虚函数,按照你题意里面的那个函数的话就是声明成virtual double CalArea() =0;
抽象类是用来被继承的,也就是用来生成派生类用的,本身不能生成实例。
纯虚函数由子类来实现定义,如果有几个派生类的话,这几个派生类可以定义各自的和纯虚函数同名的函数,另外如果派生类中还是纯虚函数的话,那么该派生类也是抽象类,也不能生成实例。

例如你的例子里,double CalArea()应该是个计算面积的函数,从Object类派生的Rect和Circle类来看,Object可以看成是图形类。因为各个图形的面积计算方法可能不同,例如Rect(长方形)和Circle(圆形)的面积公式不一样。因此可以在Object类中声明一个纯虚函数CalArea(),Object就成了抽象类
如果出现Object aOb,bOb;这样的声明,编译时会报错,因为抽象类不能生成实例。
继承类Rect中的double CalArea()可以定义成{return (a*b)*h/2.0;}
继承类Circle中的double CalArea()可以定义成{return 3.14*a*a;}
加入还有一个Object的派生类Triangle(三角形)的话,double CalArea()可以定义成{return a*b/2.0;}

在c++中,抽象类基本上是为了实现多态性而存在的。所谓多态,就是基类对象的指针指向其派生类的对象,使用派生类所定义的函数(在基类中要定义过)
比如你的例子:
Object是基类,定义了calarea()这样的函数,从字面意思上看是计算面积,然后其派生类Rect和Circle重载了这个函数用于分别计算长方形和园的面积。
在for这个循环中,可以轻松+愉快的输出不同形状的面积,类的使用者可以不考虑类内部是如何设计的,仅仅cout<<"the area is "<<obj[i]->calarea()<<endl;就可以完成不同形状下求面积的工作~~这就是多态~

在面向对象的概念中,我们知道所有的对象都是通过类来描绘的,但是反过来