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

Iza*_*ela 4 c void-pointers parametric-polymorphism

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

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

unw*_*ind 5

可能是因为该机制"过于机械",在多态性被认为有用的意义上它不再有用.

此外,因为在事实之后没有简单的方法来扩展多态函数.

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

Matrix4x4 a, b, c;

a = ...; /* Initialize matrices. */
b = ...;
c = a + b; /* Use overloaded (polymorphic) operator + to add. */
Run Code Online (Sandbox Code Playgroud)

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

在C中,即使你有一个功能

void super_add(void *sum, const void *a, const void *b);
Run Code Online (Sandbox Code Playgroud)

你怎么告诉它Matrix,如果你只是写的类型?你必须有一些通用的类型描述系统:

void super_add(const char *sum_type, void *sum, const char *atype, void *a, const char *btype, const void *b);
Run Code Online (Sandbox Code Playgroud)

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

void super_add_register(const char *sum_type, const char *atype, const char *btype, void (*adder)(void *sum, const void *a, const void *b));
Run Code Online (Sandbox Code Playgroud)

那么你必须实现代码以匹配类型名称与正确的添加函数,以及on和on.

简而言之,一般来说它不值得.但是请注意,有些库可以执行很多操作,例如GObject.