闲来无事,写一下C语言如何面向对象编程吧:
面向对象编程
/*===========================================================
文件名: class.c
版本:1.0
时间:2017-11-12
作者:连志安
功能:C语言是一个面向过程编程的语言,本程序简单的实现面向对象
的思想,功能较为简陋。
1、如何定义一个类。
其实可以使用C语言的结构体加函数指针来实现。
例如:
struct fat {
int age;
void (*create)(struct fat * this); //创建函数
void (*destroy)(struct fat * this); //销毁函数
void (*write)(struct fat * this); //成员函数
};
typedef struct fat * class_fat; //这一句是必须的,把结构体指针
2、继承:
struct son {
CLASS_FATHER(fat); //继承此父类========= 这里就是继承了
void (*create)(struct son * this); //创建函数
void (*destroy)(struct son * this); //销毁函数
void (*write)(struct son * this); //成员函数
};
typedef struct son * class_son;
3、使用
struct son * son1 = new_class(son1, son); //创建一个实例
son1->write(son1); //调用写函数
del_class(son1); //销毁实例
4、父类函数复写:
class_overwrite(write, son_write); //重写父函数 write. 并用新的son_write函数
//class_def(write); //不重写父函数
剩下的看下面代码,不懂联系 连志安
===========================================================*/
#include <stdio.h>
/*====================================================================
以下是相关宏
====================================================================*/
#define class_size(cls) sizeof(struct cls)
#define CLASS_FATHER(x) struct x * my_father
#define new_class(new, cls) (struct cls *)malloc(class_size(cls)); new->create = cls##_create; new->destroy = cls##_destroy; new->create(new)
#define del_class(new) new->destroy(new); free(new); new = NULL
#define father this->my_father
#define CLASS_FATHER_INIT(cls) father = new_class(father, cls);
#define CLASS_FATHER_DESTROY() del_class(father)
#define class_def(x) this->x = father->x
#define class_overwrite(x, fun) this->x = fun
/*===================================================
父类
===================================================*/
struct fat {
int age;
void (*create)(struct fat * this); //创建函数
void (*destroy)(struct fat * this); //销毁函数
void (*write)(struct fat * this); //成员函数
};
typedef struct fat * class_fat;
//父类写函数
void fat_write(class_fat this)
{
printf("fat_write \r\n");
}
//
void fat_create(class_fat this)
{
this->write = fat_write;
printf("fat_create \r\n");
}
void fat_destroy(class_fat this)
{
printf("fat_destroy \r\n");
}
/*===================================================
子类
===================================================*/
struct son {
CLASS_FATHER(fat); //继承此父类
void (*create)(struct son * this); //创建函数
void (*destroy)(struct son * this); //销毁函数
void (*write)(struct son * this); //成员函数
};
typedef struct son * clas_son;
void son_write(clas_son this)
{
father->write(father); //调用父类的写函数
printf("son_write \r\n");
}
void son_create(clas_son this)
{
CLASS_FATHER_INIT(fat);//声明父类
class_overwrite(write, son_write); //重写父函数
//class_def(write); //不重写父函数
printf("son_create \r\n");
}
void son_destroy(clas_son this)
{
CLASS_FATHER_DESTROY(); //注销父类
printf("son_destroy \r\n");
}
void plubic_write(clas_son son)
{
son->write(son);
}
int main(void)
{
struct son * son1 = new_class(son1, son); //创建一个实例
son1->write(son1); //调用写函数
del_class(son1); //销毁实例
while(1);
return 0;
}