【问题标题】:Trying to achieve polymorphism in C [duplicate]试图在C中实现多态性[重复]
【发布时间】:2012-02-19 20:12:15
【问题描述】:

可能重复:
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;
}

【问题讨论】:

  • 对不起,也许我在这里错了...我在这里看不到多态性...您只是在分配函数指针并调用它们...
  • @navin 不是多态性“同名不同任务”吗?
  • @navin wiki 说“在面向对象编程的上下文中,多态性是创建变量、函数或具有多种形式的对象的能力......”跨度>
  • 也许我的回答不清楚……恕我直言,多态性或子类型多态性是 OOPS 的概念……您可以在 C 中实现它们……但多态性的概念本身就是哎呀...(如果错了请纠正我)
  • @navin 你说的对据我所知,一切都可以在 C 中完成,毕竟它最接近机器(如果没有汇编那么多。)

标签: c polymorphism


【解决方案1】:

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

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

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

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

【讨论】:

  • 如果这本书是现成的,在答案中提供 URL 是明智的。
  • 你能解释一下否决票吗?他问:“我是 C 的新手,C++ 试图在 C 中实现多态性(C 不支持)但是有什么办法吗?”回答“如果你想要 C 中的多态性,就按照 C++ 中的方式实现它”有什么问题?这种方法会奏效。使用 C++ 会更简单的事实是对另一个问题的回答。
【解决方案2】:

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

您的代码有问题(无法编译!)。那应该是 void (*al)(void); 在您的 main 中,并且您应该在 tripplesquare 的参数列表中包含 void。在分配给al 的函数名称前不需要&amp;,尽管我认为它不会造成任何实际伤害。 (但请注意;使用数组名和数组名的地址是有区别的!即:char a[10]; char *s = a; char (*t)[10] = &amp;a;)您还应该在每个函数的每条消息的末尾包含一个换行符。消息开头的换行符通常(但不总是)表示问题。有时,可以在消息末尾省略换行符,但不经常。

在 C 中实现的任何多态性都将使用函数指针。但是,在您习惯使用函数指针而不尝试多态之前,您不应该尝试在 C 中实现多态。我想这可以说是“通过跳入深渊来学习游泳”,但是您最好学习像 C++ 这样支持多态性的语言,而不是尝试在实际上不这样做的 C 中这样做.

【讨论】:

  • “消息开头的换行符通常(但不总是)表示问题”你能详细说明一下吗?
  • 在示例中,square() 中消息开头的换行符是必要的,因为来自tripple() 的上一条消息没有以换行符结尾;如果省略,则"in sq" 将紧跟在"in tripple" 字符串之后。如果tripple() 以换行符结尾,则square() 中的前导换行符将是不必要的,除非您希望输出中有一个空行。 tripple() 中的消息末尾应该有一个换行符。 &lt;stdio.h&gt; 系统通常在发送换行符时刷新输出;没有换行符的数据可以保持一段时间不打印。
  • 他只是表示消息开头的换行符在实践中非常罕见,并且可能表明编写代码的人不太擅长 C。 printf 被缓冲,如果没有消息末尾的换行符直到稍后(通常在程序退出时)才会输出任何内容
【解决方案3】:

要解决您眼前的问题,您需要输入al 作为函数指针。代替void *al,使用void (*al)(void)

void* 是一个指向未知类型值的指针,因此不能作为函数执行。 void (*al)(void)。是一个指向没有参数的函数的指针,它什么都不返回。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-01
    • 2014-12-03
    • 2012-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多