C语言实现封装、继承和多态

C语言实现封装、继承和多态

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; 


©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。