1、使用结构体模拟类
C语言中,可以使用struct
(结构体)来模拟类,结构体可以包含类似类中属性的数据成员。
#include <stdio.h>
// 定义一个结构体来模拟类
typedef struct {
int x, y;
} Point;
// 创建一个新Point的函数(构造函数)
Point create_point(int x, int y) {
Point p = {x, y};
return p;
}
// 打印Point的函数(方法)
void print_point(Point p) {
printf("Point(%d, %d)\n", p.x, p.y);
}
2、使用函数指针模拟方法
通过使用函数指针,可以在C语言中模拟面向对象的“方法”,即将行为(函数)与特定实例的结构体关联。
#include <stdio.h>
typedef struct {
int x, y;
void (*print)(struct Point); // 函数指针作为"方法"
} Point;
void print_point(Point p) {
printf("Point(%d, %d)\n", p.x, p.y);
}
Point create_point(int x, int y) {
Point p = {x, y, print_point}; // 初始化时赋值函数指针
return p;
}
int main() {
Point p = create_point(3, 4);
p.print(p); // 通过函数指针调用方法
return 0;
}
3、 模拟继承
C语言没有直接支持继承,但可以通过将一个结构体嵌套在另一个结构体中,模拟继承的行为。
#include <stdio.h>
// 基类
typedef struct {
int x, y;
} Shape;
// 派生类(继承自Shape)
typedef struct {
Shape base; // 通过包含基类结构体实现“继承”
int radius;
} Circle;
// 打印Shape的函数
void print_shape(Shape s) {
printf("Shape at (%d, %d)\n", s.x, s.y);
}
// 打印Circle的函数
void print_circle(Circle c) {
printf("Circle at (%d, %d) with radius %d\n", c.base.x, c.base.y, c.radius);
}
int main() {
Shape s = {10, 20};
print_shape(s); // 打印基类
Circle c = {{30, 40}, 5}; // 初始化Circle,包含Shape部分
print_circle(c); // 打印派生类
return 0;
}
4、模拟多态
OOP中的多态允许你使用单一的接口来表示不同类型的对象。在C语言中,可以通过函数指针来模拟多态行为,在不同的结构体类型上定义不同的行为。
#include <stdio.h>
// 定义基类,包含虚函数(函数指针)
typedef struct {
void (*draw)(void *self);
} Shape;
void draw_shape(void *self) {
printf("Drawing a generic shape\n");
}
// 定义派生类(Circle)并实现自己的draw方法
typedef struct {
Shape base; // 继承自Shape
int radius;
} Circle;
void draw_circle(void *self) {
Circle *circle = (Circle *)self;
printf("Drawing a circle with radius %d\n", circle->radius);
}
int main() {
Shape shape = {draw_shape};
Circle circle = {{draw_circle}, 10}; // 用派生的draw方法初始化
shape.draw(&shape); // 调用基类的draw方法
circle.base.draw(&circle); // 通过多态调用派生类的draw方法
return 0;
}
5、封装
C中,可以通过使用static
函数和变量来模拟封装,限制对结构体内部成员的访问(类似于面向对象语言中的私有字段)。
#include <stdio.h>
typedef struct {
int x, y;
} Point;
// 私有函数(不能在文件外部访问)
static void set_coordinates(Point *p, int x, int y) {
p->x = x;
p->y = y;
}
void print_point(Point p) {
printf("Point(%d, %d)\n", p.x, p.y);
}
int main() {
Point p;
set_coordinates(&p, 5, 10); // 只能在当前文件内访问
print_point(p);
return 0;
}
6、构造函数和析构函数
C语言没有内建的构造函数和析构函数,但可以通过使用初始化和清理函数来模拟这些行为。
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int x, y;
} Point;
Point *create_point(int x, int y) {
Point *p = malloc(sizeof(Point));
p->x = x;
p->y = y;
return p;
}
void destroy_point(Point *p) {
free(p);
}
int main() {
Point *p = create_point(5, 10); // 构造函数
printf("Point(%d, %d)\n", p->x, p->y);
destroy_point(p); // 析构函数
return 0;
}