试图在C中实现多态性

时间:2012-01-26 18:15:18

标签: c polymorphism

  

可能重复:
  How can I simulate OO-style polymorphism in C?

我是C的新手,C ++尝试在C中实现多态(C不支持)但是有什么方法可以做到吗?

我的代码在哪里出错了?我已经看到这个网站上的代码有点复杂,我理解所以修改它但它不起作用。对不起,如果这个问题看起来很基本甚至是愚蠢的话。

#include <stdio.h>

void tripple() {
    printf("in tripple");
}

void square() {
    printf("\nin sq");
}

int main() {
    void *al;
    al=&tripple;
    (*al)();
    al=&square;
    (*al)();
    return 0;
}

3 个答案:

答案 0 :(得分:4)

坦率地说,你最好推迟尝试在C中实现多态,直到你不再是C语言编程的新手。

你的代码是可疑的(它不能编译!)。这应该是void (*al)(void);中的main,您应该在voidtripple的参数列表中包含square。您&的作业中的函数名称前面不需要al,但我认为它不会造成任何实际伤害。 (请注意;使用数组名称和数组名称的地址之间存在差异!即:char a[10]; char *s = a; char (*t)[10] = &a;)您还应该在每个函数的每个消息的末尾添加换行符。消息开头的换行符通常(但不总是)表示问题。有时,可以在消息末尾省略换行符,但不经常这样。

在C中实现的任何多态都将使用函数指针。但是你不应该尝试在C中实现多态,直到你习惯使用函数指针而不尝试多态。我想可以说它是“通过跳入深入学习游泳”,但你最好学习一种支持多态的C ++这样的语言,而不是尝试用C语言来实现它。

答案 1 :(得分:3)

要解决您的直接问题,您需要输入al作为函数指针。而不是void *al,请使用void (*al)(void)

void*是指向未知类型值的指针,因此无法作为函数执行。 void (*al)(void)。是一个没有参数的函数的指针,它不返回任何内容。

答案 2 :(得分:1)

看看如何在C ++中使用VTABLE和VPTR来实现多态虚函数调用。

关于这个主题的好读物可以在Bruce Eckel的Thinking In C ++ Vol.1中找到。

参考:C ++如何实现后期绑定,第636页,Thinking In C ++(本书以PDF格式免费提供)

链接到下载页面:http://mindview.net/Books/TICPP/ThinkingInCPP2e.html