zoukankan      html  css  js  c++  java
  • 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;  
      
    }  
    
  • 相关阅读:
    【机器学习】scikit-learn中的特征选择小结
    【机器学习】scikit-learn中的数据预处理小结(归一化、缺失值填充、离散特征编码、连续值分箱)
    【机器学习】随机森林原理与调参小结
    用find命令巧查目录下文件的个数
    git
    数据库删除主键
    Linux安装JDK
    计算机进制
    java虚拟机故障处理工具
    线程的六种状态
  • 原文地址:https://www.cnblogs.com/cuianbing/p/11580594.html
Copyright © 2011-2022 走看看