爲什麼說我們可以在C編程中用void *實現參數多態?C編程:void * - 爲什麼不是參數多態?
教授提出的問題,從來沒有回答。我相信一個void *實際上是一個非常低的水平被認爲是參數多態,但是有更強的理由嗎?
爲什麼說我們可以在C編程中用void *實現參數多態?C編程:void * - 爲什麼不是參數多態?
教授提出的問題,從來沒有回答。我相信一個void *實際上是一個非常低的水平被認爲是參數多態,但是有更強的理由嗎?
拍攝參數多態的定義是:
一種機制,必要時或明或暗地與具體類型替換類型變量。
void *
不適合。
C可以通過宏執行: http://rosettacode.org/wiki/Parametric_polymorphism#C
可能是因爲機制太「機械」,太多以至於在多態性被認爲是有用的意義上它停止有用。
另外,因爲在事實之後沒有簡單的方法來擴展多態函數。
在C++中,你可以平凡做到這一點:
Matrix4x4 a, b, c;
a = ...; /* Initialize matrices. */
b = ...;
c = a + b; /* Use overloaded (polymorphic) operator + to add. */
在C++中,上述使用在Matrix4x4
類中定義的operator+()
,並且能夠確定在編譯時。因此,添加新數據類型時,會添加描述如何執行添加的相關代碼,並重新使用現有的+
名稱。在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));
那麼你」 d必須實現代碼來將類型名稱與正確的添加函數進行匹配,並且繼續。
總之,這並不值得。但請注意,有許多庫都會執行很多操作,例如GObject。