4

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

教授提出了这个问题,没有回答。我相信 void* 实际上是被认为是参数多态性的非常低级别的东西,但有更强有力的理由吗?

4

2 回答 2

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

于 2012-12-17T10:50:15.927 回答
1

采用参数多态的这个定义:

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

void *不适合。

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

于 2012-12-17T11:01:55.453 回答