为什么说我们可以在C编程中用void *实现参数多态?这是不正确的?
教授提出了这个问题而从未回答过。我认为void *实际上是一个非常低的水平,被认为是参数多态,但有更强的理由吗?
答案 0 :(得分:5)
可能是因为该机制“过于机械”,所以在多态性应该有用的意义上它不再有用。
此外,由于在事实之后没有简单的方法来扩展多态函数。
在C ++中,您可以轻松地执行此操作:
Matrix4x4 a, b, c;
a = ...; /* Initialize matrices. */
b = ...;
c = a + b; /* Use overloaded (polymorphic) operator + to add. */
在C ++中,上面使用operator+()
类中定义的Matrix4x4
,并且能够在编译时确定。因此,在添加新数据类型时,会添加描述如何执行添加的相关代码,并重新使用现有的+
名称。在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