[C语言]设计类继承

本文展示了如何在C语言中使用面向对象的方法,定义了一个Shape基类和其派生类Rectangle、Circle和Square,通过输入长宽、半径和边长计算并输出各自面积。
摘要由CSDN通过智能技术生成

        定义一个基类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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值