C语言是一门面向过程的编程语言,里面没有类的说法,没有类的继承、封装、多态。Cpp是有类的概念的,Cpp本身就来源C语言,Cpp的类就是一个经过高度封装的C语言结构体。在学习Cpp之前,了解C语言的设计模式非常重要,今天就用C语言结构体进行简单的继承、封装、多态。
1.封装
面向对象编程,每个对象都有自己的封装的方法(函数),在C语言中,结构体内是不允许定义函数的,但我们可以定义一个函数指针,将这个指针指向我们定义的函数,实现调用函数的目的。
#include<stdio.h>
#include<stdlib.h>
//声明一个结构体
struct myclass
{
void(*pfunc)();//声明一个函数指针
};
void printfinfo()
{
printf("come from myclass");
}
void main()
{
struct myclass my;
my.pfunc=printfinfo;//函数名即是函数地址,让结构体的函数指针指向函数
my.pfunc();//调用
system("pause");
}
2.继承
C语言的结构体是允许嵌套结构体的,嵌套结构体就可以获得其他结构体的属性。
#include<stdio.h>
#include<stdlib.h>
//声明一个父类结构体
struct fatherclass
{
int fatherdata;
void(*pfa)();//函数指针
};
//子类结构体
struct childclass
{
int childdata;//子类自己的属性
struct fatherclass f;//在子类定义一个父类结构体
};
void printfinfo()
{
printf("come from fatherclass");
}
void main()
{
struct childclass mychild;
mychild.childdata=20;
mychild.f.fatherdata=30;//父类结构体的属性
mychild.f.pfa=printfinfo;//子类结构体继承了指针函数
printf("childdata=%d\n",mychild.childdata);
printf("fatherdata=%d\n",mychild.f.fatherdata);
mychild.f.pfa();//调用方法(函数)
system("pause");
}
3.多态
多态是同一个接口,多种实现。简单来说就是一个函数接口,但用来干什么,取决于子类用来调用什么函数。在C语言中,我们可以在父类结构体定义一个空类型的函数指针,指向的函数取决于子类结构体。
#include<stdio.h>
#include<stdlib.h>
//父结构体
struct fatherclass
{
void(*pf)();//函数指针
};
struct childclass
{
struct fatherclass f;//在结构体嵌套结构体,继承
};
//定义两个函数,供子类调用
void eat()
{
printf("eat\n");
}
void run()
{
printf("run\n");
}
void main()
{
//定义两个子类
struct childclass child1;
struct childclass child2;
child1.f.pf=eat;//子类1指向eat
child2.f.pf=run;//子类2指向run
//同一个接口,不同的实现
child1.f.pf();
child2.f.pf();
system("pause");
}
这只是C语言的一些简单封装,主要是搞明白对象的设计模式。