0

4ページに次のように書かれています。

Objective-C は、レシーバーのクラスと親クラスを検索することによって、実行時にどのコードがメッセージを処理するかを動的に決定します。(Objective-C ランタイムは、パフォーマンスを向上させるために検索結果をキャッシュします。) 対照的に、C++ コンパイラは、コンパイル時にディスパッチ テーブルを静的に構築します。

私は StackOverflow とウィキペディアで多くのことを読んできましたが、C++ が Dynamic Dispatch (Dynamic Binding の実装であると言う人もいます) をサポートしているかどうかについて、完全に混乱していると言えば十分です。

Dynamic Dispatch、Dynamic Binding、および C++ がこれらのいずれかまたは両方をサポートしているかどうかの違いを明確にできる人はいますか? 私は C++ や Objective-C の専門家ではなく、Java、Python、および PHP の世界から来ました。

4

6 に答える 6

2

この本で言及されている動的ディスパッチは、おそらく C++ のコンテキストで通常言及されている別の動的ディスパッチです。

  • C++ は、仮想関数の形式で動的ディスパッチをサポートします。実際に呼び出される関数はオブジェクトの動的な型に依存しますが、対応する名前とパラメーターは実際にはコンパイル時に認識されます。
  • 私は Objective C の専門家ではありませんが、呼び出されたときに参照される個々のオブジェクトに実行時に関数を動的に追加できることを理解しています。C++ は、この種の動的ディスパッチをサポートしていません。
于 2012-01-02T21:01:02.317 に答える
1

C ++は、仮想メンバー関数を介した動的ディスパッチをサポートします。

この本がそうではないと言っているとは思わない。「C++コンパイラは、コンパイル時にディスパッチテーブルを静的に構築します」と記載されています。これは真実です。動的ディスパッチを実装するために使用されるディスパッチテーブル( "vtable")は、少なくともC ++の最も一般的な実装では、コンパイル時に作成されます。

于 2012-01-02T20:45:10.540 に答える
1

あなたのタイトルはあなたの質問とは異なります。

この本の説明は正しいです。C++仮想ディスパッチは実行時に実行されますが、ディスパッチテーブルはコンパイル時に生成されます。ただし、これは、C++が「動的ディスパッチ」をサポートしていないということとは異なります。仮想関数は動的ディスパッチの形式ですが、「動的ディスパッチ」という用語で提出されるものには多くのレベルがあります。

于 2012-01-02T20:45:24.860 に答える
1

基本的に、C++ はキーワード「virtual」を使用して「部分的」動的です。通常、この機能を「レイト メソッド バインディング」と呼びます。これは、実行時に呼び出す特定のメソッドを決定します。

ただし、OC はその強力なランタイム システムによって「純粋な」動的 (javascript ほど純粋ではない) です。実行時に呼び出す適切なメソッドを選択することは言うまでもなく、実行時にメソッドと ivar を追加できます。通常、この機能を「動的メッセージ ディスパッチ」と呼んでいます。

ご覧のとおり、メソッド呼び出しの観点からは、ほとんど同じように機能します。詳細なメソッド検索プロセスは異なります (c++ は仮想テーブルを調べ、oc はそのクラスのメソッド リストで運試しを行います) が、どちらも実行時に柔軟性があります。

于 2014-01-07T03:06:53.983 に答える
1

「動的ディスパッチ」が「特定のオブジェクトのメソッドへの呼び出しに対して呼び出される関数を実行時に変更する」ことを意味する場合、はい: C++ には、言語レベルで、これを行うための構造化されたネイティブメカニズムがありません (つまり、実行時に v-table ポインター、または v-table 内の関数ポインターを変更します。実装固有の構造を強制することで可能ですが、子供を傷つける可能性があります :-) 「ポルノコーディング」として扱います!)

しかし、C++ には、クラス継承と仮想関数に基づく「動的ディスパッチ」があります。サブオブジェクトの集合体としてオブジェクトを実装し、特定のインターフェイス (実質的には「動作パターン」) に対して独自のバリアントを実装し、必要に応じてサブオブジェクトを変更することで、最も可能性の高い動的ディスパッチに到達できます。

于 2012-01-02T21:59:55.903 に答える
0

C ++は、仮想関数を介した動的ディスパッチをサポートします。

ただし、オブジェクトの実行時型とメソッドのパラメータの実行時型に基づいて呼び出すメソッドを決定するシステムであるダブルディスパッチは(ネイティブに)サポートされていません。

于 2012-01-02T20:45:55.020 に答える