天天看点

C语言面向对象编程之封装与继承

c语言的封装

封装在 C++ 语言中有 protected 、 private 关键字在语言层面上支持,而 C 语言中没有这些。 C 有结构( struct ),其实可以实现封装和隐藏。

c++的实现

QObject{  
public:  
    xxx  
    xxx  
private:  
    QObjectPrivate * priv;  
}; 
           

c的实现

struct st_abc_private;  
    struct st_abc {  
        int a;  
        xxx;  
        void (*xyz_func)(struct st_abc*);  

        struct st_abc_private * priv;  
    };

    struct st_abc * new_abc();  
    void delete_abc(struct st_abc *); 
           

上面的代码,我们只前向声明结构体 struct st_abc_private ,没人知道它里面具体是什么东西。假如 struct st_abc 对应的头文件是 abc.h ,那么把 st_abc_private 的声明放在 abc_p.h 中,abc.c 文件包含 abc_p.h ,那么在实现 struct st_abc 的函数指针 xyz_func 时如何使用 struct st_abc_private ,客户程序员根本无须知道。

c语言的继承

struct  Adt2   
{  
    int x;  
    int y;  
    int (*imll)(int x, int y);  
};  

struct Adt1  
{  
    int var1;  
    int var2;  
    struct  Adt2 var3;  
    int (*add)(int x, int y);  
    int (*sub)(int x, int y);  
};  

int add(int x,int y);  
int sub(int x,int y);  
int imll(int x, int y);  

int main()  
{  
    struct Adt1 a;  
    a.sub = sub;  
    a.var3.imll = imll;  
    a.var1 = ;  
    a.var2 = ;  
    a.var3.x = ;  
    a.var3.y = ;  
    a.add(a.var1, a.var2);  
    a.sub(a.var1, a.var2);  
    a.var3.imll(a.var3.x,a.var3.y);  
    return ;  
}  

int imll(int x, int y)  
{  
    printf("%d * %d = %d\n",x, y, x*y);  
    return x*y;  
}  

int add(int x, int y)  
{  
    printf("%d + %d = %d\n", x, y, x+y);  
    return x+y;  
}  

int sub(int x, int y)  
{  
    printf("%d - %d = %d\n",x, y, x-y);  
    return x-y;  
}  
           

继承在语法层面上看,有数据成员、函数,数据成员通过上面的方法自动就“继承”了,至于函数,在结构体表示为函数指针,其实也是一个数据成员,是个指针而已,也会自动“继承”。

继续阅读