我们都知道封装、继承、多态是c++面向对象中的基本特征。C语言是面向过程的语言,自身没有这些特性,那如何使用C语言来模拟C++的封装、继承、多态等面向对象的基本特征。下面就要讨论一下封装、继承、多态等面向对象在c语言中是如何实现的。
一、封装
封装:C++中的封装是利用public,protected、private来进行实现的,来隐藏一些不想让别人能够看到的一些东西,只留一些接口给用户进行使用,C语言中有结构体(struct),可以实现封装和隐藏。
为了隐藏一个类的具体实现,一般是一个公开的头文件,一个私有头文件,私有头文件中定义实现的细节,公开头文件中定义开放给客户和其他程序员的接口和公共数据。封装性的意义在于,函数和数据是绑在一起的,数据和数据是绑在一起的。这样就可以通过简单的一个结构指针访问到所有的数据,遍历所有的函数。
struct _Data;
typedef void (*process)(struct _Data* pData); //结构体指针
typedef struct _Data //数据和数据进行绑定
{
int value;
process pProcess;
}Data;
二、继承
C++的继承主要是可以在基类的基础上能够增添新有的功能,子类可以拥有父类的所有行为,同时也能够将原有的行为进行更改,在设计C语言继承性的时候,我们需要做的就是把基础数据放在继承的结构的首位置即可。这样数据的访问就不会存在问题。
typedef struct _parent //基础数据
{
int data_parent;
}Parent;
typedef struct _Child
{
struct _parent parent; //基础数据放于继承结构的首位置
int data_child;
}Child;
三、多态
多态,就是说用同一的接口代码处理不同的数据。比如说,一个通用的结构也不清楚是什么数据,什么类型的处理函数?我们在处理时只需要调用函数就可以了,剩下的事情我们不需要管,因为不同的接口会有不同的函数去处理。
typedef struct _play
{
void* pData; //未知类型的数据
void (*start_play)(struct _play* pPlay);
}Play;