C编程:void * - 为什么不参数化多态?

时间:2012-12-17 10:44:45

标签: c void-pointers parametric-polymorphism

为什么说我们可以在C编程中用void *实现参数多态?这是不正确的?

教授提出了这个问题而从未回答过。我认为void *实际上是一个非常低的水平,被认为是参数多态,但有更强的理由吗?

2 个答案:

答案 0 :(得分:5)

可能是因为该机制“过于机械”,所以在多态性应该有用的意义上它不再有用。

此外,由于在事实之后没有简单的方法来扩展多态函数。

在C ++中,您可以轻松地执行此操作:

Matrix4x4 a, b, c;

a = ...; /* Initialize matrices. */
b = ...;
c = a + b; /* Use overloaded (polymorphic) operator + to add. */

在C ++中,上面使用operator+()类中定义的Matrix4x4,并且能够在编译时确定。因此,在添加新数据类型时,会添加描述如何执行添加的相关代码,并重新使用现有的+名称。在C中,你不能这样做。

在C中

,即使你有一个功能

void super_add(void *sum, const void *a, const void *b);

如果你刚写了这个类型,你怎么告诉它Matrix?您必须拥有一些通用的类型描述系统:

void super_add(const char *sum_type, void *sum, const char *atype, void *a, const char *btype, const void *b);

您必须提供某种形式的注册机制,以便添加新功能:

void super_add_register(const char *sum_type, const char *atype, const char *btype, void (*adder)(void *sum, const void *a, const void *b));

然后你必须实现代码以匹配正确的添加功能的类型名称,并且不断开启。

简而言之,一般来说它不值得。但请注意,有些库可以执行大量此操作,例如GObject

答案 1 :(得分:1)

采用参数多态的定义:

在必要时用具体类型显式或隐式替换类型变量的机制。

void *不合适。

C可以通过宏来完成: http://rosettacode.org/wiki/Parametric_polymorphism#C