为什么说我们可以用 void* 在 C 编程中实现参数多态性是不正确的?
教授提出了这个问题,没有回答。我相信 void* 实际上是被认为是参数多态性的非常低级别的东西,但有更强有力的理由吗?
为什么说我们可以用 void* 在 C 编程中实现参数多态性是不正确的?
教授提出了这个问题,没有回答。我相信 void* 实际上是被认为是参数多态性的非常低级别的东西,但有更强有力的理由吗?
可能是因为该机制“过于机械化”,以至于在多态性应该有用的意义上它不再有用。
也因为事后没有简单的方法来扩展多态函数。
在 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。
采用参数多态的这个定义:
一种在必要时用具体类型显式或隐式替换类型变量的机制。
void *
不适合。
C 可以通过宏来实现: http ://rosettacode.org/wiki/Parametric_polymorphism#C