問題タブ [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 に答える
79 参照

c++ - 次の前方宣言された多重継承ポインタ変換コードはどのように機能しますか?

次のコードでは、ポインター変換と多重継承はどのように連携しますか?

私の理解はちょっと不安定です。

一方では、someWorkはBarについて何も知らないので、これは機能しないはずです。しかし一方で、私は前方宣言されたBarを持っています。

ありがとう!

0 投票する
4 に答える
16793 参照

c++ - 仮想テーブルC++

「仮想関数が宣言されたクラスには仮想テーブルが存在する」と書いている人をたくさん読んでいます。

私の質問は、vtableは仮想関数を持つクラスにのみ存在するのか、それともそのクラスから派生したクラスにも存在するのかということです。

例えば

質問:派生したクラスのvtableがなかった場合、出力は「派生した印刷」ではなかったでしょう。したがって、IMOには、仮想関数が宣言されているクラスと、そのクラスから継承するクラスのvtableが存在します。これは正しいです ?

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

c++ - 多くの異なる型を取ることができる 2 つのオペランドを持つ仮想関数

具体的な例から始めましょう。C++ では、抽象基本クラスの下にクラスの階層がありますCollisionVolume。衝突ボリュームはdetectCollision、他のボリュームとできる必要があります。この衝突コードは、存在する 2 つのサブクラスに基づいて特殊化されていますが、交換可能ですdetectCollision(a, b) == detectCollision(b, a)

オブジェクトは通常抽象基本クラスであるため、仮想関数と同様のメカニズムを使用する必要があります。ただし、一般的な仮想メソッドを使用すると、選択された関数はオペランドの 1 つの型にのみ依存し、両方には依存しません。これを行うことができた唯一の方法は、RTTI または RTTI のようなメカニズムを使用することでした。

これを行うためのよりクリーンな方法はありますか?

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

c++ - スペルミスの仮想関数の検出

私はこの問題に何度も巻き込まれました:

関数が純粋仮想の場合、コンパイラーはエラーをキャッチします。しかし、そうでない場合、これは追跡するのにひどいバグになる可能性があります。問題の一部は、関数名が長すぎる可能性があることです。しかし、私はまだ疑問に思っています、これらのバグを早く見る方法はありますか?

0 投票する
10 に答える
9163 参照

c++ - 実際に仮想関数があるのはなぜですか?

私はC++が初めてです。

メソッドのオーバーライドと C++ の仮想関数の概念の違いを教えてください。

仮想関数の機能は、その派生クラスでオーバーライドできます。派生クラスで関数を再定義することは、関数のオーバーライドと呼ばれます。

実際に仮想関数があるのはなぜですか?

0 投票する
4 に答える
156 参照

c++ - クラスが仮想メソッドを宣言し、コンパイラがvptrを使用する必要がない場合はありますか?

オブジェクトの型が仮想メソッドを持つクラスであっても、コンパイラーがインスタンス化されたオブジェクトにvptrを割り当てる必要がない最適化の可能性があるかどうか疑問に思いました。

たとえば、次のことを考慮してください。

この例では、コンパイラはコンパイル時にpFooのタイプを確実に認識しているため、pFooにvptrを使用する必要はありません。コンパイラがvptrの使用を回避できるもっと興味深いケースはありますか?

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

c++ - 基本クラスから C++ 仮想関数を解決する

これがだまされている場合は申し訳ありませんが、正しい答えが見つかりません。

基本クラスのメンバーから関数を呼び出し、それをサブクラスのバージョンに解決したいと考えています。virtual と宣言すればできると思ったのですが、そうではありません。これが私のアプローチです:

私は何を間違っていますか?

どうもありがとう

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

c++ - メンバー関数内での仮想関数の呼び出し

BruceEckelによるThinkinginC++を読んでいます。第15章(第1巻)の「コンストラクター内の仮想関数の動作」という見出しの下で、彼は次のように述べています。

コンストラクター内にいて、仮想関数を呼び出すとどうなりますか?通常のメンバー関数の内部では、何が起こるかを想像できます。オブジェクトは、メンバー関数が属するクラスに属しているのか、それから派生したクラスに属しているのかをオブジェクトが認識できないため、実行時に仮想呼び出しが解決されます。一貫性を保つために、これがコンストラクター内で行われるべきことだと思うかもしれません。

ここでブルースは、オブジェクトのコンストラクター内で仮想関数を呼び出すと、ポリモーフィズムは表示されない、つまり現在のクラスの関数が呼び出されるだけで、その関数の他の派生クラスバージョンではないことを説明しようとしています。これは有効であり、理解できます。クラスのコンストラクターは、クラスが実行されているのか、他の派生オブジェクトの作成のために実行されているのかを事前に知らないからです。さらに、そうすると、部分的に作成されたオブジェクトで関数が呼び出されることになり、悲惨なことになります。

彼が通常のメンバー関数について述べている最初の文のために私の混乱が突然起こりましたが、彼は仮想呼び出しが実行時に解決されると言っています。しかし、待ってください。クラスのメンバー関数内で、別の関数(仮想または非仮想)を呼び出すと、それ自体のクラスバージョンのみが呼び出されます。例えば

上記のコードでは、A::add()への呼び出しsubadd()が行われると、常に呼び出しが行われ、A::subadd()同じことが当てはまりますBよね?では、「仮想呼び出しは、メンバー関数が属するクラスに属しているのか、それから派生したクラスに属しているのかをオブジェクトが認識できないため、実行時に解決される」とはどういう意味ですか?

彼は基本クラスポインタを介した呼び出しに関してそれを説明していますか?(私は本当にそう思う)その場合、彼は「通常のメンバー関数の内部」と書くべきではない。これまでの私の理解では、同じクラスの別のメンバー関数内からのメンバー関数の呼び出しはポリモーフィックではありません。間違っている場合は修正してください。

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

c# - 保護された内部を保護されたものでオーバーライドします!

これは、1時間前に尋ねられたextensionこの質問に対するものです。

inクラスaccess modifiersをオーバーライドする場合、を変更することはできません。名前空間のクラスを検討するvirtual methodderivedControlSystem.Web.UI

今これを検討してください

誰もがこれを説明できますか?ありがとう