• 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;  
      
    }  
    
  • 相关阅读:
    BZOJ 1391: [Ceoi2008]order
    BZOJ 4504: K个串
    2019 年百度之星·程序设计大赛
    POJ 2398 Toy Storage (二分 叉积)
    POJ 2318 TOYS (二分 叉积)
    HDU 6697 Closest Pair of Segments (计算几何 暴力)
    HDU 6695 Welcome Party (贪心)
    HDU 6693 Valentine's Day (概率)
    HDU 6590 Code (判断凸包相交)
    POJ 3805 Separate Points (判断凸包相交)
  • 原文地址:https://www.cnblogs.com/cuianbing/p/11580594.html
Copyright © 2020-2023  润新知