Cに関するウィキペディアの記事には、Function and data pointers permit ad hoc run-time polymorphism
.
これはどういう意味ですか?説明してください。
Cに関するウィキペディアの記事には、Function and data pointers permit ad hoc run-time polymorphism
.
これはどういう意味ですか?説明してください。
私が考えることができる例の 1 つは、 qsort関数における C のアドホック ポリモーフィズムです。qsort 関数は比較関数 (関数ポインター) を入力として受け取るため、さまざまなデータ型で qsort を使用できます。
qsort のプロトタイプは次のとおりです。
void qsort(void *base, size_t nel, size_t width, int (*compar)(const void *, const void *));
qsort の比較関数の形式は次のとおりです。
int (*compar)(const void *, const void *);
qsort関数はqsortアルゴリズムのアルゴリズム実装のみを効果的に提供することに注意してください。使用されるデータ型と、比較関数とデータ抽象化のために関数ポインタを巧みに使用することによって抽象化されるデータ型の比較を残しますvoid *
。
qsort は、関数とデータの両方を抽象化する例を提供し、それによって C でアドホック ポリモーフィズムを使用する道を開きます。
次のコードを調べます。
#include <stdio.h>
typedef int (*Func)(int a, int b);
int sum(int a, int b) {
return a + b;
}
int substruct(int a, int b) {
return a - b;
}
int main(int argc, char** argv){
Func f = sum;
printf("%d\n", f(1, 2));
f = substruct;
printf("%d\n", f(1, 2));
}
出力:
3
-1
ここでは、さまざまな関数をポインターに割り当てると、プログラムの動作がどのように変化するかを示しました。これはポリモーフィズムの一種です。
私ができる最も明確な答えは、最初の C++ コンパイラが実際に C++ コードを C に変換し、その C コードを exe にコンパイルしたことを思い出すことです。
この実装の痕跡は、仮想関数に使用される「vtable」の概念にまだぶら下がっています。これは関数ポインタの単なるテーブルであるため、クラスは別の実装を呼び出すために vtable を変更できます。