指引网

当前位置: 主页 > 编程开发 > C >

关于C语言的面向对象理解

来源:网络 作者:佚名 点击: 时间:2017-07-19 23:07
[摘要]  C语言是面向过程的函数式编程,可以说没有面向对象编程(C++是面向对象编程),不过,C也可以实现一些面向对象的形式,现在来谈谈我的理解。

这几天又仔细研究了下 C OOP ,有点新的结果,在这分享下,下面大概说下.

Inherit(继承)

 代码如下 复制代码
#define CB_CLASS_INHERIT_BEGIN(THIS, PARENT_CLASS)struct THIS {PARENT_CLASS super;#define CB_CLASS_INHERIT_END()
};#define CB_CLASS_POINTER_SET_PARENT(THIS, name, value) ((THIS) - >super) - >name = value;#define CB_CLASS_SET_PARENT(THIS, name, value) ((THIS).super).name = value;
typedef struct _Base Base;
struct _Base {
    int a;
};
typedef struct _Child Child;
CB_CLASS_INHERIT_BEGIN(_Child, Base)
/**< _Child继承Base结构体 */
int b;
int c;
CB_CLASS_INHERIT_END() int main(int argc, char * argv[]) {
    Child m;
    CB_CLASS_SET_PARENT(m, a, 5);
    m.b = 3;
    printf("Parent a=%d,Child b=%dn", m.super.a, m.b);
    return 0;
}

Template(模板)

 代码如下 复制代码
/* — Struct Template — */
< pre > #define TplTest(T)struct _test {T a;
};
/* — Function Template — */
#define TplTestFun(T)T testFun() {T a = 0;
    return a;
}
int main(int argc, char * argv[]) {
    TplTest(char * );
    struct _test obj;
    obj.a = "This is a String";
    TplTestFun(int);
    printf("%s,%dn", obj.a, testFun());
    return 0;
}

Polymorphism(多态)

C多态机制主要是实现类似C++的虚函数表

 代码如下 复制代码
#include < Akita / Akita.h > typedef struct _Base Base;
typedef struct _BaseVt BaseVt;
typedef struct _Child Child;
typedef struct _ChildVt ChildVt;#define GetVt(p, type)((type * )(void * ) p) - >vt#define BaseShow(p) GetVt(p, BaseVt).doSomething((Base * ) p);#define ChildShow(p) GetVt(p, ChildVt).doAnthing((Child * ) p);
void displayBase();
void displayChild();
void justDoIt();
/* — Base — */
struct _Base {
    void( * doSomething)(Base * p);
    /**< Function Pointer */
};
struct _BaseVt {
    Base vt;
};
/* — Child — */
CB_CLASS_INHERIT_BEGIN(_Child, Base);
/< Inherit */void( * doAnthing)(Child * p);
CB_CLASS_INHERIT_END();
struct _ChildVt {
    Child vt;
};
/* — Base Init — */
void InitBase(BaseVt * *p) { * p = (BaseVt * ) malloc(sizeof(BaseVt)); ( * p) - >vt.doSomething = displayBase;
}
/* — Child Init — */
void InitChild(ChildVt * *p) { * p = (ChildVt * ) malloc(sizeof(ChildVt)); ( * p) - >vt.super.doSomething = displayChild; ( * p) - >vt.doAnthing = justDoIt;
}
void displayBase() {
    printf("%sn", "I’m Base");
}
void displayChild() {
    printf("%sn", "I’m Child");
}
void justDoIt() {
    printf("%sn", "I’m Child ,do anything");
}
int main(int argc, char * argv[]) {
    BaseVt * p;
    InitBase( & p);
    BaseShow(p);
    InitChild((Child * *) & p);
    BaseShow(p);
    ChildShow(p);
    return 0;
}
------分隔线----------------------------