問題タブ [dynamic-binding]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - C++ の関数を仮想としてマークするのはいつですか?
メソッドの静的バインディングの C++ の性質により、これはポリモーフィック呼び出しに影響します。
ウィキペディアから:
このディスパッチ メカニズムに関連するオーバーヘッドは低いですが、言語が対象とするように設計された一部のアプリケーション領域では、依然として重要な場合があります。このため、C++ の設計者である Bjarne Stroustrup は、動的ディスパッチをオプションで非デフォルトにすることを選択しました。virtual キーワードで宣言された関数のみが、オブジェクトのランタイム タイプに基づいてディスパッチされます。他の関数は、オブジェクトの静的タイプに基づいてディスパッチされます。
だからコード:
がChild クラスにあるParent クラスarea()
のnon-virtual
関数である場合、上記のコードは、開発者が期待していない可能性のある を呼び出します。(導入した static-binding のおかげです)overridden
Parent's class method
他の人が使用するクラス (ライブラリなど) を作成したい場合、そのような以前のコードが期待どおりに実行されるように、すべての関数を仮想にする必要がありますか?
c++ - 仮想機能の活用
次のサンプル コードを検討してください。
実行の出力は次のとおりです。
質問:
行
Base* bp = &d2
では、オブジェクトの型はコンパイル時に認識されます。では、どの関数を使用するかの決定はbp->vf();
、コンパイル時に行うこともできますよね?オブジェクトの型はコンパイル時にわかっているので、仮想関数の力はこのサンプル プログラムで使用されているのでしょうか。
c++ - コンストラクターを仮想化できない理由を調査に基づいて説明: 間違いがあれば修正してください
コンストラクターが仮想化できない理由を調べるために、いくつかの調査を行いました。ここで理解を深めます。
最初に仮想関数とは何かを説明し、次に最初の説明に基づいてコンストラクターが仮想化できない理由を説明します。
とはvirtual function
?
仮想関数は、同じシグネチャを持つ関数によって、派生クラスで再定義またはオーバーライドできる基底クラスの関数またはメソッドです。つまり、仮想関数を使用すると、派生クラスで基本クラス メソッドのカスタマイズされた実装を使用できます。
virtual
キーワードで宣言する必要があります。仮想関数の呼び出し時に、呼び出し元のオブジェクトのタイプ (動的バインディング) に応じて、関数定義のバージョン (基底クラスまたは派生クラス) を選択する決定が実行時に行われます。関数が仮想として宣言されると、仮想関数を呼び出すオブジェクトの型を実行時にのみ決定する必要があることをコンパイラに伝えます。次に、オブジェクトのタイプに基づいて、関数呼び出しを関数定義にバインドし、適切な関数を呼び出す必要があります。
なぜ aconstructor
は仮想化できないのですか?
関数が仮想として宣言されると、関数を呼び出すオブジェクトの型を実行時にのみ決定し、オブジェクトの型に基づいて適切なバージョンの関数を呼び出す必要があることをコンパイラに伝えます。
コンストラクターが virtual であると宣言された場合、コンストラクターを呼び出すオブジェクトの型を実行時に決定する必要があることをコンパイラーに伝えます。ただし、オブジェクトを構築する場合、オブジェクトの正確なタイプは、実行時ではなくコンパイル時にわかっている必要があります。これが、コンストラクターを仮想化できない理由です。
両方の回答に誤りがあれば、SO メンバーに訂正していただきたいと思います。間違いを指摘するだけでなく、回答として書き直して回答を修正していただければ、私や他の人の助けになると思います。
c# - コンバーターを使用する要素の動的バインディングを行う方法は?
クライアント オブジェクト モデルを使用して Silverlight Web パーツを開発しています。次のように、プロジェクトにコンバーターが 1 つあります。
このコンバーターを使用して、次の要素のバインドを行っています
次のように TimeLog クラスで定義されたプロパティが 1 つあります。
バインディングは私にとってはうまく機能しています。次のように、データグリッドのloadingrowイベントがあります。
SummaryDataGrid_LoadingRow
上記のコードの次の行を参照してください
上記の行では、特定の行インデックスに対して動的に textblok の Foreground プロパティのバインドを行いたいと考えています。この場合、コンバーターが値を取得するようにします(特定の行インデックスに対して次の値を返します)
これを行う方法がわかりません。上記の問題のコードまたはリンクを教えてください。私が何か間違ったことをしているなら、私を導いてください。
c++ - コンストラクターからの仮想関数と純粋仮想関数の呼び出し
基本コンストラクターから仮想関数を呼び出すと、コンパイラーはエラーを出しません。しかし、基本クラスのコンストラクターから純粋仮想関数を呼び出すと、コンパイルエラーが発生します。
以下のサンプルプログラムを検討してください。
ここでは、純粋仮想関数に定義があることがわかります。bptr->virtualfunc()
基本クラスで定義された純粋仮想関数は、が実行されたときに呼び出されることを期待していました。代わりに、コンパイルエラーが発生します。
エラー:コンストラクターから呼び出された抽象仮想 `virtual void base :: virtualfunc()'
これの理由は何ですか?
c++ - O'Reilly の「Objective-C Pocket Reference」では、C++ は Dynamic Dispatch をサポートしていないと主張していますが、これは本当ですか?
4ページに次のように書かれています。
Objective-C は、レシーバーのクラスと親クラスを検索することによって、実行時にどのコードがメッセージを処理するかを動的に決定します。(Objective-C ランタイムは、パフォーマンスを向上させるために検索結果をキャッシュします。) 対照的に、C++ コンパイラは、コンパイル時にディスパッチ テーブルを静的に構築します。
私は StackOverflow とウィキペディアで多くのことを読んできましたが、C++ が Dynamic Dispatch (Dynamic Binding の実装であると言う人もいます) をサポートしているかどうかについて、完全に混乱していると言えば十分です。
Dynamic Dispatch、Dynamic Binding、および C++ がこれらのいずれかまたは両方をサポートしているかどうかの違いを明確にできる人はいますか? 私は C++ や Objective-C の専門家ではなく、Java、Python、および PHP の世界から来ました。
c++ - 動的バインディングクラスでのC++テンプレートの使用
以前はC++でテンプレートと動的バインディングの両方を使用していましたが、最近それらを一緒に使用しようとすると、コンパイルが不可能であることがわかりました。
私がやろうとしていることは次のようなものです:
MyClassは、動的メモリバインディングを利用するクラスです。数時間検索した後、これはまだ解決できない影響を引き起こしているという印象を受けたので、この問題とその解決方法についてのガイダンスを期待していました。
私の最終的な目標は、次のようなことができるようにすることです。
さまざまな方法でポインタを使用してみましたが、機能せず、何ができるかわかりません。
上記で次のエラーが発生します。
c++ - オーバーライドされない仮想関数のバインディングタイプ
virtual function
基本クラスのaがnot overriden
派生クラスにある場合を考えてみます。次にbase class pointer to a derived class object
、仮想関数を使用して呼び出されます。
関数の呼び出しは、コンパイル時に基本クラスの関数に解決されることを理解しています。
質問
関数は派生クラスでオーバーライドされないため、関数呼び出しはコンパイル時に関数実装にバインドされますか、それとも実行時までバインドを遅らせますか?
c++ - 基本クラスのサブオブジェクトへのポインター。どのバージョンの仮想関数が呼び出されますか?
ではdynamic binding
、ポインタが指しているオブジェクトのタイプに基づいて、関数呼び出しが関数実装にバインドされます。
次のコードがあるとします。
関数func
を基底クラスで virtual と宣言します。次に、動的バインディングにより、仮想関数の派生クラスのバージョンがfunc
実行時に呼び出されます。
上記の考え方は理解できました。
しかし、上記の概念を研究した後に研究した次の概念に混乱しました。
上記のコード スニペットでは、派生クラス オブジェクトへのポインターが基本クラス オブジェクトへのポインターに暗黙的に変換されます。次にbptr
、実際には派生クラス オブジェクトの基本クラス サブオブジェクトを指し、派生クラス オブジェクトを指しません。
基本クラスのポインターbptr
は基本クラスのサブオブジェクトを指しているため、実行時に基本クラスのバージョンの仮想関数func
を呼び出すべきではありませんか?
objective-c - Objective-C の動的バインディングについてまだ混乱している
質問は、この質問への回答に追加したばかりのコメントからのものですが、重複してはいけません。
その質問に対する@Bavariousからの答えは私には理にかなっていますが、オブジェクトがIDであってもランタイムがメソッドを正しいオブジェクトにバインドできない理由はまだ混乱していますか? 私の理解では、dynamic binding
またはdynamic typing
コンパイラーはIDの背後にあるオブジェクトを知る方法がないということですが、ランタイムはそれを認識し、メッセージの受信者として正しいオブジェクトを選択する必要があります. しかし、なぜランタイムはそれができないのでしょうか?