1. 封装
C语言中虽然没有类,但有struct和指针。我们可以在一个struct中存入数据和函数指针,以此来模拟类行为。
typedef struct _Parent
{
int a;
int b;
void (*print)(struct _Parent *This);
}Parent;
封装性的意义在于,函数和数据是绑在一起的,数据和数据是绑在一起的。这样,我们就可以通过简单的一个结构指针访问到所有的数据,遍历所有的函数。封装性,这是类拥有的属性,当然也是数据结构体拥有的属性。
2.继承
如果要完全地用C语言实现继承,可能有点难度。但如果只是简单的做一下,保证子类中含有父类中的所有成员。这还是不难的。
typedef struct _Child
{
Parent parent;
int c;
}Child;
在设计C语言继承性的时候,我们需要做的就是把基础数据放在继承的结构的首位置即可。这样,不管是数据的访问、数据的强转、数据的访问都不会有什么问题。
3. 多态
这个特性恐怕是面向对象思想里面最有用的了。
要用C语言实现这个特性需要一点点技巧,但也不是不可能的。
我们使用上面定义的两个结构体Parent, Child。简单地描述了一个多态的例子。
#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;
}