問題タブ [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.
c++ - 仮想機能とパフォーマンス - C++
私のクラス設計では、抽象クラスと仮想関数を広範囲に使用しています。仮想関数がパフォーマンスに影響を与えるような気がしました。これは本当ですか?しかし、このパフォーマンスの違いは目立たず、時期尚早の最適化を行っているように見えます。右?
c++ - Arduino C ++コード:仮想関数と例外を使用できますか?
質問からのこのコメントのフォローアップファームウェアの作成:アセンブリまたは高レベル?:
Arduinoプラットフォーム用のC++コードをコンパイルするときに、仮想関数や例外などを使用できますか?または、(コメントで説明されているように)C ++のサブセットを使用したい(しなければならない)でしょうか?
Arduinoプラットフォーム用にプログラミングする際のその他の注意点はありますか?
c++ - C++でパブリック仮想関数をプライベート関数でオーバーライドする
オーバーライドされたC++仮想関数のアクセス許可を基本クラスとは異なるものにする理由はありますか?そうすることで何か危険はありますか?
例えば:
C ++のよくある質問には、それは悪い考えだと書かれていますが、その理由は書かれていません。
私はいくつかのコードでこのイディオムを見てきましたが、プライベートメンバー関数をオーバーライドすることは不可能であるという仮定に基づいて、作成者がクラスを最終的にしようとしていたと思います。ただし、この記事では、プライベート関数をオーバーライドする例を示します。もちろん、C++に関するよくある質問の別の部分ではそうしないことを推奨しています。
私の具体的な質問:
派生クラスと基本クラスで仮想メソッドに異なる権限を使用することに技術的な問題はありますか?
そうする正当な理由はありますか?
c++ - クラス設計の提案-C++
バックグラウンド
私は英語のテキストを同等の地域の言語のテキストに変換する音声変換プログラムに取り組んでいます。地域の言語は英語の文字よりも多くの文字を持ち、地域の言語のフォントはフォント内のほぼすべての位置(1〜255)を使用します。
私のプログラムはさまざまなフォントをサポートしており、文字にアクセスできるメソッドを持つフォントクラスを作成しました。このクラスには、それぞれが各文字を表す255個のメソッドがあります。新しいフォントが必要な文字メソッドをオーバーライドできるように、これらはすべて仮想としてマークされています。
このフォントクラスのメソッドは簡単です。すべてのメソッドは1行です。例は
質問
- 1つのクラスに255個の仮想関数があると、パフォーマンスの問題が発生しますか?vtableに関することは知っていますが、このシナリオでどの程度の影響があるかはわかりません。
- 誰かがこのクラスの代替デザインを提案できますか?主な設計目標は、派生クラスが必要なメソッドをオーバーライドできるようにすることです。マップやベクトルなどのコンテナに文字を追加し、文字を取得するメソッドを提供することを考えました。しかし、255個のアイテムがあり、このクラスは頻繁に使用されるため、キャラクターを取得するためにコンテナーをループする必要があるたびに、これも問題になると思います。
何か考えはありますか?
c++ - Safely override C++ virtual functions
I have a base class with a virtual function and I want to override that function in a derived class. Is there some way to make the compiler check if the function I declared in the derived class actually overrides a function in the base class? I would like to add some macro or something that ensures that I didn't accidentally declare a new function, instead of overriding the old one.
Take this example:
Here parent::handle_event()
is called instead of child::handle_event()
, because the child's method misses the const
declaration and therefore declares a new method. This could also be a typo in the function name or some minor difference in the parameters types. It can also easily happen if the interface of the base class changes and somewhere some derived class wasn't updated to reflect the change.
Is there some way to avoid this problem, can I somehow tell the compiler or some other tool to check this for me? Any helpful compiler flags (preferably for g++)? How do you avoid these problems?
c++ - コンストラクターからの仮想関数呼び出し
間違っているかもしれませんが、これは非常に基本的な質問のようです。突然、継承チェーンが機能しなくなりました。小さな基本的なテスト アプリケーションを作成したことで、間違っていたのは私であることが証明されました (したがって、コンパイラを責めることはできません)。
仮想関数でデフォルトの動作をする基本クラスがあります。子クラスはそれから派生し、動作を変更します。
これは以下を出力します:
Child インスタンスが作成されると、なぜ Base::print() が呼び出されるのですか? virtual キーワードを使うことで、関数を派生クラスに置き換えることができると思いました。
どの時点で私は自分自身を混乱させましたか?
c++ - テンプレートまたは抽象基本クラス?
クラスを適応可能にし、外部からさまざまなアルゴリズムを選択できるようにしたい場合、C++ での最適な実装は何ですか?
主に2つの可能性があります。
- 抽象基本クラスを使用し、具体的なオブジェクトを渡します
- テンプレートを使用する
以下は、さまざまなバージョンで実装された小さな例です。
バージョン 1:抽象基本クラス
バージョン 2a:テンプレート
バージョン 2b:テンプレートとプライベート継承
Java 出身の私は当然、常にバージョン 1 を使用する傾向がありますが、STL コードなどでは、テンプレート バージョンが好まれることが多いようです。それが本当なら、メモリ効率など(継承なし、仮想関数呼び出しなし)のためだけですか?
バージョン 2a と 2b の間に大きな違いはないことを認識しています。 C++ FAQを参照してください。
これらの可能性についてコメントいただけますか?
.net - .NETでは、クラスインスタンス/インターフェイスをパラメータとして渡すときに、1つのオブジェクトまたは完全なvtableを渡しますか
インターフェイスまたはクラスのインスタンスをパラメーターとして渡す場合、インスタンスでメソッドを呼び出すと、vtableを再帰的に呼び出し、適切なものを正しく呼び出す必要があるため、多くのオブジェクトまたは完全なvtableを渡しますか?
これはどのように作動しますか?
c++ - 多重継承 + 仮想関数の混乱
次のようなダイヤモンドの多重継承シナリオがあります。
共通の親である A は、仮想関数 fn() を定義します。
B と C の両方が を定義することは可能fn()
ですか?
そうである場合、次の質問は、D が B と C の両方の fn() に明確化せずにアクセスできるかどうかです。これにはいくつかの構文があると思います..
そして、BとCが誰であるかを具体的に知らなくても、Dがそれを行うことは可能ですか? B と C は他のいくつかのクラスに置き換えることができ、D のコードをジェネリックにしたいと考えています。
私がやろうとしているのは、D にその祖先にある fn() のすべてのインスタンスを何らかの方法で列挙させることです。これは、仮想関数という他の手段で可能ですか?