【C语言】用 C 语言实现多态

C语言没有类的概念,但可以用结构体包含公共成员(类似基类),再通过函数指针实现动态绑定。

示例:图形面积计算

步骤1:定义"基类"Shape

cpp 复制代码
// shape.h
#ifndef SHAPE_H
#define SHAPE_H

typedef struct Shape Shape;

// 函数指针类型定义
typedef double (*area_func_t)(const Shape*);

struct Shape {
    area_func_t area;  // 虚函数指针
};

// 统一调用接口(实现多态)
double shape_area(const Shape* shape);

#endif

步骤2:实现具体"派生类"

cpp 复制代码
// circle.h
#ifndef CIRCLE_H
#define CIRCLE_H

#include "shape.h"

typedef struct {
    Shape base;   // 继承Shape
    double radius;
} Circle;

void circle_init(Circle* circle, double radius);

#endif
cpp 复制代码
// circle.c
#include "circle.h"
#include <math.h>

static double circle_area(const Shape* shape) {
    const Circle* circle = (const Circle*)shape;
    return M_PI * circle->radius * circle->radius;
}

void circle_init(Circle* circle, double radius) {
    circle->base.area = circle_area;  // 绑定具体实现
    circle->radius = radius;
}

步骤3:实现统一调用接口

cpp 复制代码
// shape.c
#include "shape.h"

double shape_area(const Shape* shape) {
    if (shape && shape->area) {
        return shape->area(shape);
    }
    return 0.0;
}

步骤4:使用多态

cpp 复制代码
// main.c
#include <stdio.h>
#include "shape.h"
#include "circle.h"
// 还可定义 rectangle.h 等

int main() {
    Circle c;
    circle_init(&c, 5.0);
    
    // 多态调用:通过基类指针调用实际类型的方法
    Shape* shapes[] = { (Shape*)&c };
    
    for (int i = 0; i < 1; ++i) {
        printf("Area: %.2f\n", shape_area(shapes[i]));
    }
    return 0;
}
相关推荐
MepSUxjvy几秒前
002:RAG 入门-LangChain 读取文本
开发语言·python·langchain
我是一颗柠檬2 分钟前
【JDK8新特性】方法引用与构造器引用Day3
java·开发语言·后端·intellij-idea
子榆.2 分钟前
CANN自定义GEMM算子(Ascend C手写高性能矩阵乘法)
c语言·开发语言·矩阵
仰泳之鹅9 分钟前
【C语言】动态内存管理
c语言·数据结构·算法
LB211213 分钟前
C++通讯录课设(西安石油大学)
开发语言·c++·算法
qq38624619619 分钟前
C3 语言:C 的现代替代方案,保守改良能否战胜激进革命?
c语言·系统编程·内存安全·c3语言·现代化特性
专注VB编程开发20年1 小时前
python语法设计、IDE 生态、平台策略、解析器逻辑这四层的矛盾点
开发语言·ide·python
潜创微科技9 小时前
IT6520:USB‑C 转 MIPI 芯片方案 4K@120Hz 高清显示
c语言·开发语言
言之。10 小时前
【Python】免费的中文 AI 配音方案
开发语言·人工智能·python
天天进步201510 小时前
Python全栈项目:从零手操一个高性能 API 网关
开发语言·python