写一个程序,定义一个抽象类Shape,由它派生3个类:Square(正方形)、Trapezoid(梯形)和Triangle三角形。用虚函数分别计算几种图形面积、并求它们的和。要求用基类指针数组,使它每一个元素指向一个派生类对象。
时间: 2024-03-25 20:40:48 浏览: 63
java利用接口和抽象类改写求圆的面积和梯形的面积.docx
好的,这是一个基于C++的程序实现:
```c++
#include<iostream>
using namespace std;
//定义抽象类Shape
class Shape{
public:
virtual double getArea() = 0; //纯虚函数,用于计算面积
};
//定义正方形类Square
class Square: public Shape{
private:
double side; //正方形边长
public:
Square(double s) : side(s){} //构造函数
double getArea(){ //实现纯虚函数
return side*side;
}
};
//定义梯形类Trapezoid
class Trapezoid: public Shape{
private:
double upper, lower, height; //上底、下底和高
public:
Trapezoid(double u, double l, double h) : upper(u), lower(l), height(h){} //构造函数
double getArea(){ //实现纯虚函数
return (upper+lower)*height/2;
}
};
//定义三角形类Triangle
class Triangle: public Shape{
private:
double bottom, height; //底边和高
public:
Triangle(double b, double h) : bottom(b), height(h){} //构造函数
double getArea(){ //实现纯虚函数
return bottom*height/2;
}
};
int main(){
Shape* shapes[3]; //定义基类指针数组
shapes[0] = new Square(5); //创建正方形对象
shapes[1] = new Trapezoid(3, 6, 4); //创建梯形对象
shapes[2] = new Triangle(4, 3); //创建三角形对象
double sum = 0; //累加器,用于计算总面积
for(int i=0; i<3; i++){
sum += shapes[i]->getArea(); //调用各个对象的getArea()函数,累加面积
}
cout << "The total area is " << sum << endl;
return 0;
}
```
在这个程序中,我们定义了一个抽象类Shape,它包含一个纯虚函数getArea(),用于计算各种形状的面积。然后我们派生出三个类:Square、Trapezoid和Triangle,每个类都实现了getArea()函数,用于计算该类对应形状的面积。
在主函数中,我们定义了一个Shape类型的指针数组shapes,它的每个元素指向一个派生类对象。然后我们遍历数组,对每个对象都调用getArea()函数,累加面积。最后输出总面积。
注意,在定义抽象类Shape时,我们将getArea()函数定义为纯虚函数,这意味着它没有实现,只是一个接口。由于每个派生类都要实现该函数,因此可以保证每个派生类对象都有getArea()函数可供调用。
阅读全文