原文
纯C语言实现简单封装继承机制_smstong的博客-CSDN博客
以下是补充实现简单演示一下思路,
函数带有包名、类名作为开头可以预防命名污染
一共 5个文件:
main.c
class_b.h
class_b.c
class_c.h
class_c.c
/* class_b.h */
/* beginning of private header file */
#ifndef _CLASS_B_H_
#define _CLASS_B_H_
#include <stdio.h>
#include <stdlib.h>
#define B_STRUCT \
int x; \
int y; \
int z; \
int (*b_member_function1)(B); \
int (*b_member_function2)(B, int arg)
typedef struct B_s *B;
struct B_s
{
B_STRUCT;
};
B new_B();
#define del_B(b)\
del_B_(&(b))
void del_B_(B *b);
int b_member_function1(B b);
int b_member_function2(B b, int arg);
#endif /* _CLASS_B_H_ */
/* ending private header file */
/* class_b.c */
#include "class_b.h"
B new_B()
{
B b = (struct B_s*)malloc(sizeof(struct B_s));
b->x = 0;
b->y = 0;
b->z = 0;
b->b_member_function1 = b_member_function1;
b->b_member_function2 = b_member_function2;
return b;
}
void del_B_(B *b)
{
free(*b);
*b = 0;
}
int b_member_function1(B b)
{
b->x = 1;
b->y = 1;
b->z = 1;
return 0;
}
int b_member_function2(B b, int arg)
{
b->x = arg;
b->y = arg;
b->z = arg;
return 0;
}
void linebrk()
{
printf("\n");
}
/* class_c.h */
/* beginning of private header file */
#ifndef _CLASS_C_H_
#define _CLASS_C_H_
/* Inheritance of classes */
/* inherit function */
#define C_STRUCT \
B_STRUCT; \
int n; \
int (*c_member_function1)(C); \
int (*c_member_function2)(C, int, int); \
int (*c_member_function3)(C, int)
typedef struct C_s *C;
struct C_s {
C_STRUCT;
};
C new_C();
#define del_C(c)\
del_C_(&(c))
void del_C_(C *c);
int c_member_function1(C c);
/* overload class function */
int c_member_function2(C c, int arg1, int arg2);
/* new class function */
int c_member_function3(C c, int arg);
#endif /* _CLASS_C_H_ */
/* ending of private header file */
/* class_c.c */
#include "class_c.h"
C new_C()
{
C c = (struct C_s*)malloc(sizeof(struct C_s));
c->x = 0;
c->y = 0;
c->z = 0;
c->c_member_function1 = c_member_function1;
c->c_member_function2 = c_member_function2;
c->c_member_function3 = c_member_function3;
return c;
}
void del_C_(C *c)
{
free(*c);
*c = 0;
}
int c_member_function1(C c)
{
return b_member_function1((B)c);
}
int c_member_function2(C c, int arg1, int arg2)
{
b_member_function2((B)c, arg1);
c->n = arg2;
return 0;
}
int c_member_function3(C c, int arg)
{
c->n = arg;
return 0;
}
/* main.c */
#include <stdio.h>
#include "class_c.h"
int main(void)
{
/* PART1: B CLASS object */
printf("init B:\n");
B b = new_B();
printf("b %%p : %p\n", b);
printf("b->x:%d, b->y:%d, b->z:%d\n", b->x, b->y, b->z);
linebrk();
printf("func1:\n");
b->b_member_function1(b);
printf("b->x:%d, b->y:%d, b->z:%d\n", b->x, b->y, b->z);
linebrk();
printf("func2:\n");
b->b_member_function2(b, 3);
printf("b->x:%d, b->y:%d, b->z:%d\n", b->x, b->y, b->z);
linebrk();
printf("del:\n");
del_B(b);
printf("b %%p : %p\n", b);
linebrk();
/* PART2: C CLASS object */
printf("init C:\n");
C c = new_C();
printf("c %%p : %p\n", c);
printf("c->x:%d, c->y:%d, c->z:%d, c->n:%d\n", c->x, c->y, c->z, c->n);
linebrk();
printf("func1:\n");
c->c_member_function1(c);
printf("c->x:%d, c->y:%d, c->z:%d, c->n:%d\n", c->x, c->y, c->z, c->n);
linebrk();
printf("func2:\n");
c->c_member_function2(c, 3, 5);
printf("c->x:%d, c->y:%d, c->z:%d, c->n:%d\n", c->x, c->y, c->z, c->n);
linebrk();
printf("func3:\n");
c->c_member_function3(c, 7);
printf("c->x:%d, c->y:%d, c->z:%d, c->n:%d\n", c->x, c->y, c->z, c->n);
linebrk();
printf("del:\n");
del_C(c);
printf("c %%p : %p\n", c);
linebrk();
return 0;
}