C語言實現類cpp的類


基於函數指針實現的成員函數,通過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);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章