基于函数指针实现的成员函数,通过struct嵌套实现简单继承派生和多态。
#include<stdio.h>
#include<stdlib.h>
// 伪类
typedef struct _Class Class;
struct _Class{
int data;
int (*f)(Class* self);
};
// 成员函数
// 原始方法手工传this指针
int f(Class * self) {
return self->data;
}
/* ------ 构造函数 ---- */
// C不像go不支持堆栈逃逸没法返回栈上类
// 本函数只修改值不分配空间
void InitClass(Class *c,int data){
c->data = data;
c->f=f;
}
// 本函数既分配空间又修改值
Class* NewClass(int data){
Class* c=(Class*)malloc(sizeof(Class));
if (c != NULL){
InitClass(c,data);
printf("Create Class successfully!\n");
}
return c;
}
/* ------ 析构函数 ---- */
void DeleteClass(Class* c){
if(c==NULL){
return;
}
free(c);
c=NULL;
return;
}
/* ------ 简单继承(可能不太安全) ---- */
// 简单的SonClass继承Class
typedef struct SonClass{
Class super;
int newdata;
}SonClass;
SonClass* NewSonClass(int olddata,int newdata){
SonClass*son=(SonClass*)malloc(sizeof(SonClass));
InitClass(&son->super,olddata);
son->newdata=newdata;
return son;
}
int main(){
// 调用成员函数
Class* c = NewClass(1111);
printf("%d\n",c->f(c));
DeleteClass(c);
// 继承+多态 父类class指针指向子类sonclass指针
SonClass* son = NewSonClass(2222,3333);
Class* cs = (Class*)son;
printf("%d\n",son->super.f(&son->super));
printf("father's data:%d\tson's data:%d\n",cs->f(cs),son->newdata);
}