私はウィキペディア( Name resolution WIKI )で「名前解決」について読んでおり、C ++が「静的名前解決」を使用していることが示されています。それが本当なら、動的な名前解決を使用せずに C++ がどのように「ポリモーフィズム」を提供するかを理解できませんでした。
C ++が「静的名前解決」または「動的名前解決」を使用しているかどうか、誰でも答えてください。静的である場合、C++ がポリモーフィズムを提供する方法についても説明できますか。
私はウィキペディア( Name resolution WIKI )で「名前解決」について読んでおり、C ++が「静的名前解決」を使用していることが示されています。それが本当なら、動的な名前解決を使用せずに C++ がどのように「ポリモーフィズム」を提供するかを理解できませんでした。
C ++が「静的名前解決」または「動的名前解決」を使用しているかどうか、誰でも答えてください。静的である場合、C++ がポリモーフィズムを提供する方法についても説明できますか。
ウィキペディアの名前解決の定義は、トークンが構成の名前 (関数、型名など) に解決される方法に関するものです。その定義を考えると、C++ はその名前解決で100%静的です。識別子を表すすべてのトークンは、コンパイル時に特定のエンティティに関連付ける必要があります。
C++ ポリモーフィズムは実質的にごまかしです。virtual
コンパイラは、静的な名前がキーワードで定義されたメンバー関数に解決されることを確認できます。this を呼び出しているオブジェクトが動的オブジェクト (つまり、その型の値ではなく、その型へのポインター/参照) であることがコンパイラーによって認識されると、コンパイラーはその関数を呼び出すための特別なコードを発行します。
この特別なコードは、解決される名前を変更しません。変更されるのは、最終的に呼び出される関数です。これは動的命名ではありません。つまり、動的関数ディスパッチです。名前はコンパイル時に解決されます。関数は実行時に解決されます。
C++ は静的な名前解決を使用します。これは、各関数の名前を変更してそれぞれが一意になるようにするためです。
つまり、関数int foo(int bar)
はコンパイラによって のようなものとして認識されますが_Z3fooi
、のint foo(float bar)
ようなものとして認識されます_Z3foof
。
これは、名前マングリングと呼ばれるものです。