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

时间:2023-02-15 14:38:00

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 = 21;
a.var2 = 12;
a.var3.x = 12;
a.var3.y = 13;
a.add(a.var1, a.var2);
a.sub(a.var1, a.var2);
a.var3.imll(a.var3.x,a.var3.y);
return 0;
}

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;
}

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