静的バインディング(イーリー・バインディング、コンパイル時):
void greet() { std::cout << "こんにちは!"; }
動的バインディング(レイト・バインディング、ランタイム):
class Animal { public: virtual void speak() { std::cout << "動物"; } }; class Dog : public Animal { public: void speak() override { std::cout << "ワン"; } }; void foo(Animal* a) { a->speak(); } // 動的バインディング
いつ使用するか:
overrideキーワードの使用は仮想関数の動作を高速化しますか?
回答:
いいえ、overrideキーワードは関数が仮想基底関数をオーバーライドする必要があることをコンパイラに明示的に示すだけです。パフォーマンスや関数の呼び出し方法には影響しません。
class A { public: virtual void func(); }; class B : public A { public: void func() override; // コンパイラの確認用だが、呼び出しの速度は変わらない };
ストーリー
高負荷な株式市場のライブラリで、チームはポリモーフィズムが必要でない場合でもほとんどの操作に仮想メソッドを使用しました。その結果、システムは計画よりも遅く動作し、主要なボトルネックはvtableルックアップでした。
ストーリー
拡張可能なアルゴリズムのプロジェクトでは、スタッフが仮想の代わりに通常のメソッドを使用していました。後に基本ポインタを介してオブジェクトを渡すと動作が変わらず、誤った計算が発生し、バグはインターフェースを書き直すことでしか修正できませんでした。
ストーリー
メディアファイルの解析プロジェクトで、開発者は静的メソッドと仮想メソッドを混同しました。異なるフォーマットのいくつかの関数を仮想メソッドとして宣言し忘れ、子クラスでオーバーライドしなかったため、ファイルの処理が誤った道を通り、結果が誤ってキャッシュされました。