C语言面向对象的简单例子
来源:嵌入式大杂烩 发布时间:2023-04-25 分享至微信

C语言是一种面向过程的语言,但是也可以用结构体和函数指针来模拟面向对象的特性,比如封装、继承和多态。下面我们来看一些具体的例子和应用。

封装是指把对象的属性和方法封装在一起,提供一个接口给外部调用,隐藏内部细节。在C语言中,我们可以用结构体来定义对象的属性,用函数指针来定义对象的方法,然后把它们放在一个结构体中,形成一个类。例如,我们可以定义一个人类:

#include<stdio.h>
#include<stdlib.h>

//定义人类
structperson{
//属性
char*name;
intage;
//方法
void(*say_hello)(structperson*p);
};

//定义人类的方法
voidsay_hello(structperson*p){
printf("Hello,Iam%s,%dyearsold.\n",p->name,p->age);
}

//创建人类的实例
structperson*create_person(char*name,intage){
structperson*p=malloc(sizeof(structperson));
p->name=name;
p->age=age;
p->say_hello=say_hello;
returnp;
}

//使用人类的实例
intmain(){
structperson*p1=create_person("Alice",20);
structperson*p2=create_person("Bob",25);
p1->say_hello(p1);
p2->say_hello(p2);
free(p1);
free(p2);
return0;
}

继承是指子类可以复用父类的属性和方法,同时可以添加或覆盖父类的属性和方法。在C语言中,我们可以用结构体嵌套来实现继承,即把父类作为子类的第一个成员。例如,我们可以定义一个学生类,继承自人类:

#include<stdio.h>
#include<stdlib.h>

//定义人类
structperson{
//属性
char*name;
intage;
//方法
void(*say_hello)(structperson*p);
};

//定义人类的方法
voidsay_hello(structperson*p){
printf("Hello,Iam%s,%dyearsold.\n",p->name,p->age);
}

//创建人类的实例
structperson*create_person(char*name,intage){
structperson*p=malloc(sizeof(structperson));
p->name=name;
p->age=age;
p->say_hello=say_hello;
returnp;
}


//定义学生类
structstudent{
//继承自人类
structpersonbase;
//属性
char*school;
//方法
void(*study)(structstudent*s);
};

//定义学生类的方法
voidstudy(structstudent*s){
printf("%sisstudyingat%s.\n",s->base.name,s->school);
}

//创建学生类的实例
structstudent*create_student(char*name,intage,char*school){
structstudent*s=malloc(sizeof(structstudent));
s->base.name=name;
s->base.age=age;
s->base.say_hello=say_hello;//复用父类的方法
s->school=school;
s->study=study;
returns;
}

//使用学生类的实例
intmain(){
structstudent*s1=create_student("Charlie",18,"MIT");
structstudent*s2=create_student("David",19,"Stanford");
s1->base.say_hello(s1->base);//调用父类的方法
s2->base.say_hello(s2->base);
s1->study(s1);//调用子类的方法
s2->study(s2);
free(s1);
free(s2);
return0;
}

多态是指不同类型的对象可以使用相同的接口,根据对象的具体类型执行不同的行为。在C语言中,我们可以用函数指针来实现多态,即把不同类型的对象都转换为一个通用类型,然后调用它们共有的函数指针。例如,我们可以定义一个动物类和两个子类:狗类和猫类,分别实现动物类的叫声方法:

#include<stdio.h>
#include<stdlib.h>

//定义动物类
structanimal{
//属性
char*name;
//方法
void(*make_sound)(structanimal*a);
};

//定义狗类
structdog{
//继承自动物类
structanimalbase;
//属性
char*breed;
};

//定义猫类
structcat{
//继承自动物类
structanimalbase;
//属性
char*color;
};

//定义动物类的方法
voidmake_sound(structanimal*a){
printf("%sismakingsound.\n",a->name);
}

//定义狗类的方法
voiddog_make_sound(structdog*d){
printf("%sisbarking.\n",d->base.name);
}

//定义猫类的方法
voidcat_make_sound(structcat*c){
printf("%sismeowing.\n",c->base.name);
}

//创建动物类的实例
structanimal*create_animal(char*name){
structanimal*a=malloc(sizeof(structanimal));
a->name=name;
a->make_sound=make_sound;
returna;
}

//创建狗类的实例
structdog*create_dog(char*name,char*breed){
structdog*d=malloc(sizeof(structdog));
d->base.name=name;
d->base.make_sound=(void(*)(structanimal*))dog_make_sound;//覆盖父类的方法
d->breed=breed;
returnd;
}

//创建猫类的实例
structcat*create_cat(char*name,char*color){
structcat*c=malloc(sizeof(structcat));
c->base.name=name;
c->base.make_sound=(void(*)(structanimal*))cat_make_sound;//覆盖父类的方法
c->color=color;
returnc;
}

//使用动物类的实例
intmain(){
structanimal*a1=create_animal("Tom");
structdog*d1=create_dog("Spike","Bulldog");
structcat*c1=create_cat("Jerry","Brown");

//多态:不同类型的对象使用相同的接口,执行不同的行为
a1->make_sound(a1);//调用动物类的方法
d1->base.make_sound(d1->base);//调用狗类的方法
c1->base.make_sound(c1->base);//调用猫类的方法

free(a1);
free(d1);
free(c1);

return0;
}

以上就是C语言面向对象的一些例子。


本文来源网络,免费传达知识,版权归原作者所有。如涉及作品版权问题,请联系我进行删除。

在公众号聊天界面回复1024,可获取嵌入式资源;回复m,可查看文章汇总


[ 新闻来源:嵌入式大杂烩,更多精彩资讯请下载icspec App。如对本稿件有异议,请联系微信客服specltkj]
存入云盘 收藏
举报
全部评论

暂无评论哦,快来评论一下吧!