C语言也有封装、继承和多态这些面向对象编程的概念,虽然没有C++和Java那样完整的面向对象编程体系,但是使用合适的编码技巧仍然可以实现这些特性。
封装
封装是指将数据和行为组合在一起,形成一个独立的、完整的、不可分割的整体,对外界隐藏对象的内部细节,只对外部暴露公共的接口,使得外部只能通过公共接口访问对象,从而保证对象的安全性、完整性和可靠性。
在C语言中,封装可以通过结构体(struct)来实现。将对象的属性(变量)和行为(函数)放在一个结构体中,定义一些操作这个结构体的函数,外部只能通过这些函数来访问对象,这个结构体就相当于一个类。
例如,下面是一个用结构体封装的简单的日期对象:
typedef struct {
int year;
int month;
int day;
} Date;
Date* createDate(int year, int month, int day) {
Date* date = malloc(sizeof(Date));
date->year = year;
date->month = month;
date->day = day;
return date;
}
void printDate(Date* date) {
printf("%d年%d月%d日\n", date->year, date->month, date->day);
}
在这个例子中,Date结构体是对象的属性,createDate和printDate函数是对象的行为。外部只能通过createDate函数来创建对象,并通过printDate函数来访问对象,保证了对象的封装性和安全性。
继承
继承是一种机制,通过它子类可以继承父类的属性和行为,父类也可以作为子类的一部分被使用。
在C语言中,继承可以通过结构体嵌套来实现。子类结构体嵌套父类结构体,子类可以继承父类的属性,并在自己的结构体中新增或重载父类的函数,从而实现继承。
例如,下面是一个用结构体嵌套实现继承的例子:
typedef struct {
int x;
} Base;
typedef struct {
Base base;
int y;
} Derived;
void printBase(Base* b) {
printf("Base.x = %d\n", b->x);
}
void printDerived(Derived* d) {
printf("Derived.x = %d, Derived.y = %d\n", d->base.x, d->y);
}
int main() {
Derived d = {{1}, 2};
printBase((Base*)&d); // 父类指针指向子类对象
printDerived(&d);
return 0;
}
在这个例子中,Base结构体表示父类,Derived结构体嵌套Base结构体表示子类,Derived结构体新增了属性y并重载了printBase函数。在main函数中,我们通过父类指针指向子类对象,并调用printBase和printDerived函数输出结果。
多态
多态是指同一种类型的对象,在不同的情况下具有不同的行为,即“一种表现形式,多种实现方式”。
在C语言中,多态可以通过函数指针来实现。定义一个参数相同的函数指针,不同的函数对应不同的行为,通过调用不同的函数来实现多态。
例如,下面是一个用函数指针实现多态的例子:
typedef struct {
void (*speak)(void);
} Animal;
void dogSpeak(void) {
printf("dog bark!\n");
}
void catSpeak(void) {
printf("cat meow!\n");
}
void speak(Animal* animal) {
animal->speak();
}
int main() {
Animal dog = {dogSpeak};
Animal cat = {catSpeak};
speak(&dog);
speak(&cat);
return 0;
}
在这个例子中,Animal结构体表示动物,speak函数指针表示动物的叫声行为,dogSpeak和catSpeak函数分别表示狗和猫的叫声行为。在main函数中,我们通过speak函数指针实现了多态,输出结果是“dog bark!”和“cat meow!”。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言也有封装,继承和多态你知道吗 - Python技术站