C语言面向对象编程

时间:2022-10-11 16:56:05

什么是面向对象

为了说明C语言也可以面向对象编程,有必要说一下面向对象中的几个概念:

  • 一切事物皆对象
  • 对象具有封装和继承特性
  • 对象与对象之间使用消息通信,各自存在信息隐藏

 

可以看出,面向对象只是一种思想,与具体语言无关,只要实现了这几条就是所谓的面向对象了。

看具体代码:

#include <stdio.h>
#include <stdlib.h>

typedef struct _CClass
{
    //添加属性
    struct _CClass *self;    //类本身,相当于C++中的this
    int a;
    int b;
    //添加方法
    void (*print)(void *self);

} CParent;


#define EXTERND_CLASS_FROM_CParent \
        void (*print)(void *self);    \
        int a;                    \
        int b;                    \
        


typedef struct _CChild
{
    //继承CParent
    EXTERND_CLASS_FROM_CParent
    //添加属性
    CParent parent;
    int c;
    int d;
    //添加方法

    void (*sayHello)();

} CChild;

void print(void *self);
void sayHello();
int main(int argc, char const *argv[])
{
    CParent *parent=(CParent *)malloc(sizeof(CParent));

    //为属性赋值
    parent->a=1;
    parent->b=2;
    parent->print=print;
    //调用方法
    parent->print((void *)parent);

    free((void *)parent);

    //继承
    CChild *child=(CChild *)malloc(sizeof(CChild));
    child->a=3;
    child->b=5;
    child->print=print;
    child->sayHello=sayHello;
    child->print((void *)child);
    child->sayHello();
    free((void *)child);
    //多态
    
    CChild *child1=(CChild *)malloc(sizeof(CChild));
    CParent *parent1=(CParent *)child1;

    parent1->a=5;
    parent1->b=6;
    parent1->print=print;
    parent1->print((void *)child1);

    free((void *)child1);

    return 0;
}


void print(void *self)
{
    CParent *tmp=(CParent *)self;
    printf("a=%d,b=%d\n",tmp->a,tmp->b);
}


void sayHello()
{
    printf("Hello World! \n");
}

 

面向对象从来都是思想,而不是语言!