已定义一个shape抽象类,在此基础上派生出矩形Rectangle和圆形Circle类,二者都有GetArea( )函数计算对象的面积,并编写测试main( )函数。 Class Shape { Public: Shape(){} ~shape(){} Virtual float GetArea()=0; }
时间: 2024-02-19 09:57:54 浏览: 77
好的,你的要求是编写C语言的代码,下面是相应的实现:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct Shape {
float (*GetArea)(struct Shape* self);
} Shape;
typedef struct Rectangle {
Shape shape;
float width;
float height;
} Rectangle;
typedef struct Circle {
Shape shape;
float radius;
} Circle;
float Rectangle_GetArea(Shape* self) {
Rectangle* rect = (Rectangle*)self;
return rect->width * rect->height;
}
float Circle_GetArea(Shape* self) {
Circle* circle = (Circle*)self;
return 3.14159 * circle->radius * circle->radius;
}
int main() {
Shape* shapes[2];
shapes[0] = (Shape*)malloc(sizeof(Rectangle));
shapes[0]->GetArea = Rectangle_GetArea;
((Rectangle*)shapes[0])->width = 2.0;
((Rectangle*)shapes[0])->height = 3.0;
shapes[1] = (Shape*)malloc(sizeof(Circle));
shapes[1]->GetArea = Circle_GetArea;
((Circle*)shapes[1])->radius = 1.0;
for (int i = 0; i < 2; i++) {
printf("Shape %d area: %f\n", i, shapes[i]->GetArea(shapes[i]));
free(shapes[i]);
}
return 0;
}
```
在这个代码中,我们首先使用 `typedef` 定义了 `Shape`、`Rectangle` 和 `Circle` 三个结构体类型。其中 `Shape` 结构体包含了一个函数指针 `GetArea`,用来计算对象的面积,它是一个虚函数(通过函数指针实现)。`Rectangle` 和 `Circle` 结构体分别包含了一个 `Shape` 类型的成员,用来支持多态性,以及各自的宽、高或半径等数据成员。
然后我们分别实现了 `Rectangle_GetArea()` 和 `Circle_GetArea()` 两个函数,它们分别用来计算矩形和圆形的面积。注意这两个函数的参数都是 `Shape*` 类型的指针,这样才能实现多态性。
在 `main()` 函数中,我们创建了一个 `Shape` 类型的指针数组,并分别用 `Rectangle` 和 `Circle` 的对象来初始化其中的元素。然后我们遍历这个数组,输出每个对象的面积,并释放掉动态分配的内存。
你可以将这个代码保存为一个名为 `shape.c` 的文件,然后在命令行中使用如下命令进行编译和运行:
```
gcc shape.c -o shape
./shape
```
然后你就可以看到输出结果了。
阅读全文