基于函數指針實現的成員函數,通過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);
}