用C语言实现c++的封装、继承、多态

c++的三大特性:封装、继承、多态

如何用C语言实现呢?

1、封装
在c++中,将数据与数据的操作封装在一起,也就是类
类只对外界开放接口,将接口的实现细节与类的一些属性,变量隐藏起来,达到数据的抽象性,隐藏性与封装性。

在C语言中,有一个类似于封装的类型——struct结构体(能够将多种数据类型封装在一起),那怎么实现将数据的操作一起封装起来呢?
我们想到了函数指针

//函数指针
void (*pf)(int)
名为pf,指向一个返回值为空,形参列表为int的函数指针
#include 
typedef struct Astruct
{
	int _a;   //成员变量
	void(*pf1)();  //成员函数指针
	int (*pf2)();
}*Astr;
int  print1()
{
	return 0;
}
int  print2()
{
	return 1;
}
void initastr(Astr str,int a)
{
	str->_a = a;
	str->pf1 = print1;
	str->pf2 = print2;
	printf("%d\n", *(str->pf1));
	printf("%d\n", *(str->pf2));

}
int main()
{
	Astr aa = (Astr) malloc(sizeof(int)*4);
	initastr( aa, 3);
	printf("%d\n", aa->_a);
	return 0;
}

2、继承
在c++中,用一个类去继承另一个类,会得到其基类的相关属性与方法

class A           //基类
{
public:
	int a;
};

class B :public A    //共有继承A  含有基类的属性
{
	int b;
};

在C语言中,我们可以使用组合的方法,在新有类中定义已有类的对象,就可以在新类中通过已有类的对象访问已有类自己的成员变量与函数。
与继承的区别:
1、继承是属于的关系,而组合是包含的关系
2、继承是复用原有类,可以通过派生类访问基类,而组合仅仅是组合在一起,只能通过已有类的对象访问自己的成员变量与函数

typedef struct A
{
	int _a;
}A;
typedef struct B
{
	A a;
	int _b;
}B;

3、多态
在c++中,多态是通过父类的指针或引用去调用一个在父类中存在的virtual 类型函数<虚函数>,实现动态绑定,我们知道,要想使用父类的指针或引用调用子类的函数,在父类中,必须将其声明为虚函数、并且与子类中的函数参数列表,返回值,函数名相同
C语言实现多态思路:
c++中的多态是通过函数覆盖实现的,在C语言中;

struct A
{
	int _a;
	void(*print) (void *p);//函数指针

};
 struct B
{
	 struct A Pa;   //包含一个A类的对象 Pa
};

void printpa(void * p)
{
	
	if (p == NULL)
		return;
	printf("call  A\n");
}
void printpb(void * p)
{
	
	if (p == NULL)
		return;
	printf("call  B\n");
}
void print_F(void* p)
{
	if (p == NULL)
		return;
	struct A* pa = (struct A*)p;
	pa->print(p);
}
int main()
{
	struct A a;
	struct B b;
	a.print = printpa;  //A 中的函数指针指向函数
	b.Pa.print = printpb;//B通过A的对象的函数指针指向的函数
	print_F(&a);
	print_F(&b);
	return 0;
}

你可能感兴趣的:(楠)