多态(Polymorphism)是指面向对象程序运行时,相同的消息可能会送给多个不同的类之对象,系统依据对象所属类,引发对应类的方法,而有不同的行为。
简单来说,所谓多态意指相同的消息给予不同的对象会引发不同的动作。在C语言中,可以通过结构体和指针来实现多态。
以下是通过结构体和指针实现多态的简单示例代码:
#include <stdio.h>
// 定义基类
struct Shape {
void (*draw)(struct Shape*) ;
} ;
// 定义派生类
struct Circle {
struct Shape shape;
int radius;
} ;
struct Rectangle {
struct Shape shape;
int width;
int height;
} ;
// 派生类的绘制函数
void drawCircle(struct Circle *circle) {
printf("Drawing a circle...\n") ;
}
void drawRectangle(struct Rectangle *rectangle) {
printf("Drawing a rectangle...\n") ;
}
int main() {
// 创建派生类对象
struct Circle circle = { .draw = drawCircle, .radius = 10 };
struct Rectangle rectangle = { .draw = drawRectangle, .width = 20, .height = 30 };
// 调用基类的绘制函数
circle.draw(&circle);
rectangle.draw(&rectangle);
return 0;
}
在上面的示例中,我们定义了一个 Shape
结构体作为基类,它包含一个指向 draw
函数的指针。我们还定义了两个派生类 Circle
和 Rectangle
,它们都包含了一个继承自基类的 Shape
结构体。
在派生类中,我们实现了各自的绘制函数 drawCircle
和 drawRectangle
。在 main
函数中,我们创建了 Circle
和 Rectangle
的对象,并将它们传递给基类的绘制函数 draw
。由于指向基类的指针可以指向派生类的对象,因此这种多态就实现了。
在运行时,程序会分别输出 "Drawing a circle..." 和 "Drawing a rectangle...",这表明不同的对象调用了不同的绘制函数。
标签:draw,struct,多态,C语言,如何,Shape,基类,circle From: https://blog.51cto.com/daniusdk/6663836