如何用C语言实现多态?

简介: 多态(Polymorphism)是指面向对象程序运行时,相同的消息可能会送给多个不同的类之对象,系统依据对象所属类,引发对应类的方法,而有不同的行为。

多态(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...",这表明不同的对象调用了不同的绘制函数。

相关文章
|
10天前
|
存储 编译器 C语言
从C语言到C++_23(多态)抽象类+虚函数表VTBL+多态的面试题(下)
从C语言到C++_23(多态)抽象类+虚函数表VTBL+多态的面试题
29 1
|
10天前
|
存储 编译器 Linux
从C语言到C++_23(多态)抽象类+虚函数表VTBL+多态的面试题(中)
从C语言到C++_23(多态)抽象类+虚函数表VTBL+多态的面试题
23 1
|
10天前
|
编译器 C语言 C++
从C语言到C++_23(多态)抽象类+虚函数表VTBL+多态的面试题(上)
从C语言到C++_23(多态)抽象类+虚函数表VTBL+多态的面试题
12 0
|
C语言 C++
【C语言实现多态效果实例】
【C语言实现多态效果实例】
89 0
|
C++ C语言 设计模式
【C/C++学院】0804-C语言和设计模式(继承、封装、多态)
<p align="left">C++有三个最重要的特点,即继承、封装、多态。<a target="_blank" name="_GoBack"></a>我发现其实C语言也是可以面向对象的,也是可以应用设计模式的,关键就在于如何实现面向对象语言的三个重要属性。</p> <p align="left"><strong><span style="color:#000099">(</span>
1730 0
|
1天前
|
C语言
C语言进阶——文件的读写(文件使用方式、文件的顺序读写、常用函数、fprintf、fscanf)
C语言进阶——文件的读写(文件使用方式、文件的顺序读写、常用函数、fprintf、fscanf)
4 0
|
1天前
|
存储 C语言
C语言学习记录——动态内存函数介绍(malloc、free、calloc、realloc)
C语言学习记录——动态内存函数介绍(malloc、free、calloc、realloc)
7 0