C語言實現(xiàn)封裝退渗、繼承和多態(tài)
1.封裝
C語言中雖然沒有類移稳,但有struct和指針。我們可以在一個struct中存入數(shù)據(jù)和函數(shù)指針会油,以此來模擬類行為个粱。
typedef struct _Parent
{
? ? int a;
? ? int b;
? ? void (*print)(struct _Parent *This);
}Parent;
封裝性的意義在于,函數(shù)和數(shù)據(jù)是綁在一起的翻翩,數(shù)據(jù)和數(shù)據(jù)是綁在一起的都许。這樣,我們就可以通過簡單的一個結(jié)構(gòu)指針訪問到所有的數(shù)據(jù)嫂冻,遍歷所有的函數(shù)胶征。封裝性,這是類擁有的屬性桨仿,當(dāng)然也是數(shù)據(jù)結(jié)構(gòu)體擁有的屬性睛低。
2.繼承
如果要完全地用C語言實現(xiàn)繼承,可能有點難度服傍。但如果只是簡單的做一下钱雷,保證子類中含有父類中的所有成員。這還是不難的吹零。
typedef struct _Child
{?
? ? Parent parent;?
? ? int c;?
}Child;?
在設(shè)計C語言繼承性的時候罩抗,我們需要做的就是把基礎(chǔ)數(shù)據(jù)放在繼承的結(jié)構(gòu)的首位置即可。這樣灿椅,不管是數(shù)據(jù)的訪問套蒂、數(shù)據(jù)的強轉(zhuǎn)、數(shù)據(jù)的訪問都不會有什么問題茫蛹。
3.多態(tài)
這個特性恐怕是面向?qū)ο笏枷肜锩孀钣杏玫牧恕?/p>
要用C語言實現(xiàn)這個特性需要一點點技巧操刀,但也不是不可能的。
我們使用上面定義的兩個結(jié)構(gòu)體Parent, Child婴洼。簡單地描述了一個多態(tài)的例子骨坑。
#include <stdio.h>
#include <stdlib.h>
typedef struct _Parent
{?
? ? int a;?
? ? int b;?
? ? void (*print)(struct _Parent *This);?
}Parent;
typedef struct _Child
{?
? ? Parent parent;?
? ? int c;?
}Child;
void print_parent(Parent *This)?
{?
? ? printf("a = %d. b = %d.\n",? This->a, This->b);?
}?
void print_child(Parent *This)?
{?
? ? Child *p = (Child *)This;?
printf("a = %d. b = %d. c = %d.\n", p->parent.a, p->parent.b, p->c);?
}?
Parent *create_parent(int a, int b)?
{?
? ? Parent *This;?
? ? This = NULL;?
? ? This = (Parent *)malloc(sizeof(Parent));?
? ? if (This != NULL)
{?
? ? ? ? This->a = a;?
? ? ? ? This->b = b;?
? ? ? ? This->print = print_parent;?
? ? ? ? printf("Create parent successfully!\n");?
? ? }?
? ? return This;?
}?
void destroy_parent(Parent **p)?
{?
? ? if (*p != NULL)
{?
? ? ? ? free(*p);?
? ? ? ? *p = NULL;?
? ? ? ? printf("Delete parent successfully!\n");?
? ? }?
}?
Child *create_child(int a, int b, int c)?
{?
? ? Child *This;?
? ? This = NULL;?
? ? This = (Child *)malloc(sizeof(Child));?
? ? if (This != NULL)
{?
? ? ? ? This->parent.a = a;?
? ? ? ? This->parent.b = b;?
? ? ? ? This->c = c;?
? ? ? ? This->parent.print = print_child;?
? ? ? ? printf("Create child successfully!\n");?
? ? }?
? ? return This;?
}?
void destroy_child(Child **p)?
{?
? ? if (*p != NULL)
{?
? ? ? ? free(*p);?
? ? ? ? *p = NULL;?
? ? ? ? printf("Delete child successfully!\n");?
? ? }?
}?
int main()?
{?
? ? Child *p = create_child(1, 2, 3);?
? ? Parent *q;?
? ? q = (Parent *)p;?
? ? q->print(q);?
? ? destroy_child(&p);
system("pause");
? ? return 0;?
}?