問題タブ [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 投票する
7 に答える
1079 参照

c++ - C++での仮想関数の動作

質問があります。以下に2つのクラスがあります。

質問は:

  • クラスDeriveのサブクラスがBaseのポインターを使用してポリモフィズムを実行したい場合、括弧内のキーワードvirtualは必要ですか?

  • 答えが「いいえ」の場合、仮想を使用する場合と使用しない場合のクラスDeriveのメンバー関数toStringの違いは何ですか?

0 投票する
1 に答える
2699 参照

c++ - vfptrを失う派生クラスオブジェクトへのポインタ

始めに、私はありふれた、単純なレイトレーサーを書こうとしています。私のレイトレーサーには、世界中に複数のタイプのジオメトリがあり、すべて「SceneObject」と呼ばれる基本クラスから派生しています。ここにそのヘッダーを含めました。

ご覧のとおり、他の場所に実装する仮想関数をいくつか含めました。この場合、派生クラスはSphereとTriangleの2つだけで、どちらも欠落しているメンバー関数を実装しています。最後に、実際の「レイトレーシング」部分を実行する静的メソッドでいっぱいのパーサークラスがあります。関連する部分のスニペットをいくつか示します

今のところ、私は本当のレイトレーシングの部分を放棄し、代わりに最初にヒットしたオブジェクトの色を返すだけです。お気づきのことと思いますが、光線がオブジェクトと交差したことをコンピューターが認識する唯一の方法は、Scene.intersect()を使用することです。これも含まれています。使用されるメンバー変数は「ベクトルオブジェクト」です。終了を参照してください

了解しました。問題が発生しました。まず、シーンを作成し、Parser :: trace()メソッドの外部のオブジェクトで埋めます。奇妙な理由で、私はRayをi = j = 0にキャストしましたが、すべてがうまく機能しています。ただし、2番目のレイがキャストされるまでに、シーンに保存されているすべてのオブジェクトはvfptrを認識しなくなります(つまり、仮想メソッドを除くすべてのSceneObjectメソッドにアクセスできます)。デバッガーを使用してコードをステップ実行したところ、getColor()の終了とループの継続の間のどこかで、すべてのvfptrへの情報が失われていることがわかりました。ただし、getColor()の引数を変更して、Sceneの代わりにScene&を使用すると、損失は発生しません。これは何のクレイジーなブードゥーですか?

要求に応じて、シーンのコード:

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

c++ - QWidget keyPressEvent オーバーライド

QTでQWidgets keyPressEvent関数をオーバーライドして、半永久的にしようとしていますが、うまくいきません。私は CPP は初めてだと言わざるを得ませんが、ObjC と標準 C は知っています。

私の問題は次のようになります。

QSGameBoard は私の QWidget サブクラスであり、keyPressEvent をオーバーライドし、登録されたオブジェクトに通知するために各イベントでシグナルを発生させる必要があります。

QSGameBoard.cpp のオーバーライドされた keyPressEvent は次のようになります。

QSGameBoard:: を QWidget:: に変更すると、イベントを受け取りますが、コンパイラがスコープについて不平を言うため、シグナルを送信できません。そして、このように書くと、関数はまったく呼び出されません。

ここで何が問題なのですか?

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

c++ - 仮想メソッドに関する質問

両方のメソッドが仮想として宣言されている場合、呼び出される Method1() の両方のインスタンスが派生クラスの Method1() であってはなりませんか?

BASE と DERIVED が毎回呼び出されるのを見ています。面接のレビューを行っていますが、これが正しいことを確認したいと思います。xD

メソッド 1 BASE
メソッド 1 DERVIED

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

c++ - ビジターおよびテンプレート化された仮想メソッド

訪問者パターンの典型的な実装では、クラスは基本クラスのすべてのバリエーション (子孫) を考慮する必要があります。ビジター内の同じメソッド コンテンツが異なるメソッドに適用される場合が多数あります。この場合、テンプレート化された仮想メソッドが理想的ですが、現時点では許可されていません。

では、テンプレート化されたメソッドを使用して、親クラスの仮想メソッドを解決できますか?

与えられた(基礎):

基礎が築かれたので、キッカーの出番です (テンプレート化されたメソッド):

意図的に、メソッド宣言Visitor_Coutにキーワードが含まれていません。virtualメソッド シグネチャの他のすべての属性は、親の宣言 (または仕様) と一致します。

全体像として、この設計により、開発者は、ターゲット オブジェクト (訪問を受け取るオブジェクト) のタイプのみが異なる共通の訪問機能を実装できます。上記の実装は、派生ビジターの実装がオプションのメソッドを実装していない場合のアラートに対する私の提案です。

これは C++ 仕様で合法ですか?

(コンパイラXXXで動作すると言う人もいますが、これは一般的な言語に対する質問です。)

0 投票する
7 に答える
1616 参照

c - 仮想関数 == 関数ポインタ?

データ構造にグループ化された一連の関数ポインターは、多くの場合、仮想関数テーブル (VFT) と呼ばれます。

上記のステートメントは私にそれを感じさせvirtual function == function pointerます、そうですか?

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

c++ - C ++の仮想関数とテンプレート-他の(C ++に存在する)操作に置き換えることはできますか?

たとえば、C ++のテンプレートの概念は、コンパイラがクラスまたは関数のために追加のコードを生成するため、快適さのためです。したがって、追加の(手作業)を行うことで、テンプレートなしで生活することができます。

仮想関数はどうですか?

両方がかけがえのない状況はありますか?

0 投票する
7 に答える
9801 参照

c++ - [C++]をオーバーライドするときに仮想関数を再宣言する必要がある理由

上記のコードはコンパイルされません。ただし、サブクラスで仮想関数を宣言すると、正常にコンパイルされます。

サブクラスがオーバーライドする関数のシグネチャがコンパイラにすでにある場合、なぜ再宣言が必要なのですか?

洞察はありますか?

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

c++ - クラスの外で仮想関数を呼び出すための構文?

クラス本体の外で仮想関数を定義するための構文は何ですか?

それは...ですか?

?

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

c++ - 抽象クラス リファレンス

クラスを受講できますか

教室{ ~Room(); 仮想コスト() =0; }

クラス ホテル{ 部屋をマップする; /* */};

私のホテルは抽象的になりますか?Room から派生した具体的な Room オブジェクトのリストを保持できますか?