問題タブ [virtual-functions]

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.

0 投票する
2 に答える
951 参照

c++ - 子クラスの C++ 呼び出し仮想メソッド

私は次のクラスを持っています:

使用するinner->doSomething()と、セグメンテーション違反が発生します。inner->doSomething()Bクラスに呼び込むにはどうしたらいいですか?

前もって感謝します。

0 投票する
2 に答える
1122 参照

c# - 仮想メソッド/プロパティの影響

私は最近、開発プロセスでMoqを使用しており、達成できることが気に入っています。

ただし、テストでメソッド(およびほとんどの場合プロパティ)をモックに置き換えることができるように、メソッド(およびほとんどの場合のプロパティ)を仮想化しています。

「すべてのメソッドとプロパティをオーバーライド可能にする」以外に、この一連のアクションにはどのような現実の影響がありますか?

0 投票する
3 に答える
3207 参照

c++ - C++ 基本クラスは、メソッドがオーバーライドされているかどうかを実行時にどのように判断できますか?

以下のサンプル メソッドは、派生クラスでオーバーライドされているかどうかを検出するためのものです。MSVC から得られるエラーは、「バインドされた」メンバーへの関数ポインターを取得しようとするのは単に間違っていることを意味しますが、これが問題になる論理的な理由はわかりません (結局のところ、これはthis->vtableにあります) )。このコードを修正するハックではない方法はありますか?

0 投票する
9 に答える
963 参照

c++ - C++ の「virtual」を理解できない

virtualC++のキーワードの目的がわかりません。C と Java はよく知っていますが、C++ は初めてです

ウィキペディアより

オブジェクト指向プログラミングでは、仮想関数または仮想メソッドは、同じシグネチャを持つ関数によって継承クラス内で動作をオーバーライドできる関数またはメソッドです。

virtualただし、キーワードを使用せずに、以下に示すようにメソッドをオーバーライドできます

以下に示すように、関数 A::a は B::a で正常にオーバーライドされます。virtual

私の混乱を悪化させているのは、これもウィキペディアからの仮想デストラクタに関するこの声明です。

次の例に示すように、最も派生したクラスのデストラクタが常に呼び出されるようにするには、C++ 基本クラスに仮想デストラクタを設定することが重要です。

virtualまた、親のデストラクタを呼び出すようにコンパイラに指示しますか? virtualこれは、「関数をオーバーライド可能にする」という私の当初の理解とは大きく異なるようです

0 投票する
5 に答える
420 参照

c++ - C++の仮想関数

私のC++プログラムでは:

ステートメントはを呼び出す必要がありますB::func()。ただし、関数C::func()は呼び出されます。これに少し光を当ててください。'クラスA'で仮想キーワードが削除されると、これは発生しなくなります。

0 投票する
2 に答える
362 参照

c++ - 純粋仮想関数

C ++プログラムの場合:

仮想関数func()がクラスBの本体内で再定義されている場合、エラーは発生しません。ただし、スコープ解決演算子を使用すると、コンパイラーはエラーをスローします。何故ですか?

0 投票する
5 に答える
303 参照

oop - ホットスワップ可能な vtables が一般的な言語機能ではないのはなぜですか?

オブジェクト指向プログラミングでは、作成済みのオブジェクトの動作を変更できると便利な場合があります。もちろん、これは戦略パターンなどの比較的冗長な手法で行うことができます。ただし、インスタンス化後に vtable ポインターを変更して、オブジェクトの型を完全に変更した方がよい場合もあります。クラスAからクラスBに切り替えると仮定すると、これは安全です:

  1. クラス B はクラス A のサブクラスであり、新しいフィールドを追加しない、または
  2. クラス B とクラス A は同じ親クラスを持ちます。親クラスの仮想関数をオーバーライドする以外は何もしません。(新しいフィールドや仮想関数はありません。)
  3. いずれの場合も、A と B は同じ不変条件を持たなければなりません。

これは、C++ および D プログラミング言語でハック可能です。ポインターを任意にキャストできるためです。これを行う高レベルの方法が一般的に提供されていないのはなぜですか?

0 投票する
8 に答える
10252 参照

c++ - 仮想メソッドまたは関数ポインタ

C ++でポリモーフィックな動作を実装する場合、純粋仮想メソッドを使用するか、関数ポインター(または関数)を使用できます。たとえば、非同期コールバックは次の方法で実装できます。

アプローチ1

したがって、ここでコールバックを使用するには、doGo()メソッドをオーバーライドして、必要な関数を呼び出す必要があります。

アプローチ2

ここでコールバックメソッドを使用するには、Callbackオブジェクトによって呼び出される関数ポインターを作成する必要があります。

アプローチ3

[これは私(アンドレアス)によって質問に追加されました。元のポスターによって書かれたものではありません]

各実装の長所と短所は何ですか?