函数和数据指针如何允许c中的临时运行时多态性?

时间:2012-07-31 04:35:44

标签: c polymorphism

wikipedia article on C表示Function and data pointers permit ad hoc run-time polymorphism

这是什么意思?请解释。

3 个答案:

答案 0 :(得分: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多态性铺平了道路。

答案 1 :(得分: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

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

答案 2 :(得分:2)

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

这种实施的遗迹仍然在&#34; vtable&#34;的概念中徘徊。用于虚函数 - 它只是一个函数指针表,因此类可以更改vtable以调用不同的实现。