定义一个基类shape,私有数据为坐标点x,y, 由它派生Rectangle类和Circle类,它们都有成员函数GetArea()求面积。
派生类Rectangle类有数据:矩形的长和宽;派生类Circle类有数据:圆的半径。Rectangle类又派生正方形Square类,定义各类并测试。
输入三组数据,分别是矩形的长和宽、圆的半径、正方形的边长,输出三组数据,分别是矩形、圆、正方形的面积。圆周率按3.14计算。
//C语言实现面向对象,细节暂不做修改,简单易懂
#include <stdio.h>
#include <stdlib.h>
#define PI (3.14)
typedef struct shape { //shape基类
int x;
int y;
} shape_t;
typedef struct Rectangle { //矩形类
const struct Rectangle* this;
shape_t point;
int (*GetArea)(const struct Rectangle*);
} rect_t;
typedef struct Circle { //圆形类
const struct Circle* this;
shape_t point;
double (*GetArea)(const struct Circle*);
} circ_t;
typedef struct Square { //正方形类
const struct Square* this;
rect_t rect;
int (*GetArea)(const struct Square*);
} squa_t;
int getRectArea(const struct Rectangle* this) {
return this->point.x * this->point.y;
}
double getCircArea(const struct Circle* this) {
return PI * this->point.x * this->point.x;
}
int getSquaArea(const struct Square* this) {
return this->rect.point.x * this->rect.point.x;
}
int main() {
rect_t rect = {
.this = &rect,
.GetArea = getRectArea
};
scanf("%d %d", &rect.point.x, &rect.point.y);
circ_t circ = {
.this = &circ,
.point.y = 0,
.GetArea = getCircArea
};
scanf("%d", &circ.point.x);
squa_t squa = {
.this = &squa,
.rect.point.y = 0,
.GetArea = getSquaArea
};
scanf("%d", &squa.rect.point.x);
int rectArea = rect.GetArea(&rect);
double circArea = circ.GetArea(&circ);
int squaArea = squa.GetArea(&squa);
printf("%d\n", rectArea);
printf("%g\n", circArea);
printf("%d\n", squaArea);
return 0;
}