3

维基百科关于 C 的文章指出Function and data pointers permit ad hoc run-time polymorphism.

这是什么意思?请解释一下。

4

3 回答 3

4

对于qsort函数中的 C 中的 ad-hoc 多态性,我能想到的示例之一。qsort 函数将比较函数(函数指针)作为输入,从而允许您使用具有不同数据类型的 qsort。

qsort 的原型如下:

void qsort(void *base, size_t nel, size_t width, int (*compar)(const void *, const void *));

qsort 的比较函数形式如下:

int (*compar)(const void *, const void *);

请注意,qsort 函数仅有效地提供了 qsort 算法的算法实现,而通过巧妙地使用函数指针进行比较函数和数据抽象,将要使用的数据类型和数据类型的比较抽象化void *

qsort 为函数和数据的抽象提供了一个示例,从而为在 C 中使用 ad-hoc 多态性铺平了道路。

于 2012-07-31T05:04:55.537 回答
3

检查以下代码:

#include <stdio.h>

typedef int (*Func)(int a, int b);
int sum(int a, int b) {
    return a + b;
}

int substruct(int a, int b) {
    return a - b;
}

int main(int argc, char** argv){
    Func f = sum;
    printf("%d\n", f(1, 2));

    f = substruct;
    printf("%d\n", f(1, 2));
}

输出:

3
-1

在这里,我演示了如何为指针分配不同的函数可以改变程序的行为。这是一种多态性。

于 2012-07-31T04:51:01.720 回答
2

我能给出的最明确的答案是提醒您,第一个 C++ 编译器实际上将 C++ 代码转换为 C,然后将该 C 代码编译为 exe。

这个实现的痕迹仍然存在于用于虚函数的“vtable”的概念中——它只是一个函数指针表,因此类可以更改 vtable 以调用不同的实现。

于 2012-07-31T04:51:07.487 回答