大家好,我最近在学习C语言面向对象的多态,请问下面这个代码里面c->base.display = (void (*)(void))circle_display;有链接成功吗,这个结果我在devC++里面并不能正常输出结果,困惑了很久,不知道怎么才能正常跑下去,看的原文章在这里,是里面的多态https://blog.csdn.net/mx_jun/article/details/138533562?ops_request_misc=&request_id=&biz_id=102&utm_term=C%E8%AF%AD%E8%A8%80%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-0-138533562.142^v100^pc_search_result_base1&spm=1018.2226.3001.4187
#include <stdio.h>
// 定义一个“接口”结构体,包含函数指针
typedef struct {
void (*display)(void);
} Shape;
// 圆形结构体,包含接口函数指针的实现
typedef struct {
Shape base; // 继承自Shape接口
double radius;
} Circle;
// 矩形结构体,包含接口函数指针的实现
typedef struct {
Shape base; // 继承自Shape接口
double width;
double height;
} Rectangle;
// 圆形display方法的实现
void circle_display(Circle *c) {
printf("Circle with radius %.2f\n", c->radius);
}
// 矩形display方法的实现
void rectangle_display(Rectangle *r) {
printf("Rectangle with width %.2f and height %.2f\n", r->width, r->height);
}
// 一个函数,接受Shape接口指针并调用其display方法
void display_shape(Shape *shape) {
shape->display(); // 注意这里并没有直接的类型检查,是静态分派的
}
// 初始化圆形并设置接口方法
void init_circle(Circle *c, double radius) {
c->radius = radius;
c->base.display = (void (*)(void))circle_display; // 强制类型转换,因为C没有类型安全的函数指针
}
// 初始化矩形并设置接口方法
void init_rectangle(Rectangle *r, double width, double height) {
r->width = width;
r->height = height;
r->base.display = (void (*)(void))rectangle_display; // 同样需要强制类型转换
}
int main() {
// 创建圆形和矩形对象,并初始化它们
Circle circle;
Rectangle rectangle;
init_circle(&circle, 5.0);
init_rectangle(&rectangle, 4.0, 6.0);
// 将它们作为Shape接口进行显示
display_shape((Shape *)&circle); // 输出:Circle with radius 5.00
display_shape((Shape *)&rectangle); // 输出:Rectangle with width 4.00 and height 6.00
return 0;
}