ファイナルまたはテンプレートを使用した静的ポリモーフィズム?

ヘンク

次のようなものを使用することの長所と短所は何ですか

template <typename TData>
class Base {
public:
   void foo()
   {
       static_cast<TData*>(this)->doFoo();
   }
};

class Derived : public Base<Derived>
{
    void doFoo() { \*...*\ }
};

の代わりに

class Base {
  virtual ~Base = default;
  virtual void foo() = 0;
};

class Derived {
  void foo() final { \*...*\ }
};

私が理解している限り、どちらのアプローチも実行時にvtable-lookupを回避しますよね?では、どのような状況で、より多くの定型文を含む最初の方法を使用する必要がありますか?

StPiere

CRTPを介した静的ポリモーフィズム(最初のケース)はコンパイル時に実行されます。コンパイル時にすべてのクラスがわかっている場合は、基本的にそれをお勧めします。注もいることBase自体が、クラスが、クラステンプレートではありません、そうBaseないの基底クラスDerived

パフォーマンスだけでなく、最初に使用するか2番目に使用するかをプロジェクトで決定することも重要です。

2番目のケースでBaseは、多形的な振る舞いのベースですDerived派生メソッドの呼び出しは、Baseへのポインタを介して呼び出すことができます。例:

Base* b = new Derived();
b->foo(); // calls Derived::foo via vtable lookup.

foo()の呼び出し方法に応じて、コンパイラーはそれを非仮想化するかどうかを指定できます。

Base* b = new Derived();
b->foo(); // cannot be devirtualized

Derived* d = new Derived();
d->foo(); // probably can be devirtualized, because compiler knows 
          // via final that none can override foo,
          // so it doesnt need to consult vtable.

基本的に、パフォーマンスだけでなく堅牢性のために、コンパイル時に実行できるすべてのことを好みます。実行時エラーは処理が困難です。しかし、それは設計上の決定でもあります。最初の方法でプロジェクトがより複雑になり、パフォーマンスの低下が小さいことが問題にならない場合は、2番目のアプローチで非常にうまくいくことができます。

「万能」の解決策はありません。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

転送参照を使用した静的ポリモーフィズム

分類Dev

c ++デコレータパターン、テンプレートを使用した静的ポリモーフィズム、およびコールバックメソッドの登録

分類Dev

静的インポートファイルまたは静的インポートの個々のアイテム

分類Dev

Linux フレーバーの OS システムは、ファイルを検索するためのウィンドウ エクスプローラーのクイック ナビゲーション機能をサポートしていますか?

分類Dev

次のコードは、静的メソッドに遅延バインディングを適用しましたか?ポリモーフィズムJava

分類Dev

デフォルトのテンプレートを使用して作成されたgithubページは、同じリポジトリからカスタムhtmlファイルをそのままレンダリングすることもできますか?

分類Dev

Dockerコンテナーを使用したGolang Webアプリの静的ファイルのデプロイ

分類Dev

スリムテンプレートを使用したSinatra--cssファイルにリンクできません:テンプレートファイルからパブリックディレクトリのcssファイルへのパスは何ですか?

分類Dev

ポリモーフィズムとポインターを使用した構造体によるキャスト

分類Dev

docker-compose ファイルは、コンテナー ディレクトリ内の dockerfile によって抽出されたファイルを削除します

分類Dev

@MappedSuperclassアノテーションを使用したHibernateエンティティポリモーフィズム

分類Dev

ステップEXECスポーンで失敗しました:そのようなファイルまたはディレクトリはありません

分類Dev

テンプレート/ポリモーフィズム

分類Dev

サンドボックスファイルシステムのディレクトリのファイルをChromeアプリでユーザーが選択したディレクトリに保存または書き込みます

分類Dev

サンドボックスファイルシステムのディレクトリのファイルをChromeアプリでユーザーが選択したディレクトリに保存または書き込みます

分類Dev

ポリモーフィズムまたはプロパティの辞書?

分類Dev

Kubernetesは、コンテナ内のファイルを使用して既存のディレクトリにボリュームをマウントします

分類Dev

Enterprise LibraryLoggingファイルリスナーのファイル名にテンプレートまたはトークンを指定する方法

分類Dev

Java 8を使用したポリモーフィズムのリファクタリング

分類Dev

NTFS(または任意のファイルシステム)は、パーティション外のファイルをサポートしていますか?

分類Dev

明示的なポリモーフィズムスローを使用したクラス階層ごとのHibernateテーブルは、リフレクション値を取得できません

分類Dev

Jackson を使用した JSON ファイルのポリモーフィックなデシリアライズ

分類Dev

ポリモーフィズムを使用したMySQL結果のフィルタリング

分類Dev

同じ署名を持つメンバー関数を呼び出すために、関数テンプレートインスタンスの代わりに継承とポリモーフィズムを使用するのはなぜですか?

分類Dev

インターフェイスとクラスを使用したポリモーフィズム

分類Dev

Pythonを使用して、選択した複数のjsonファイルをファイルディレクトリからインポートします

分類Dev

Chromeファイルシステムを使用して、ユーザーが選択したディレクトリ内にファイルを作成します

分類Dev

ディレクトリ内のサブフォルダをループし、.CSVファイルから指定された列をインポートします

分類Dev

ラズベリーパイ4(arm64 / armv8)で実行するためのコンテナー化されたrustアプリケーションのコンパイル。「そのようなファイルまたはディレクトリはありません」を実行できません

Related 関連記事

  1. 1

    転送参照を使用した静的ポリモーフィズム

  2. 2

    c ++デコレータパターン、テンプレートを使用した静的ポリモーフィズム、およびコールバックメソッドの登録

  3. 3

    静的インポートファイルまたは静的インポートの個々のアイテム

  4. 4

    Linux フレーバーの OS システムは、ファイルを検索するためのウィンドウ エクスプローラーのクイック ナビゲーション機能をサポートしていますか?

  5. 5

    次のコードは、静的メソッドに遅延バインディングを適用しましたか?ポリモーフィズムJava

  6. 6

    デフォルトのテンプレートを使用して作成されたgithubページは、同じリポジトリからカスタムhtmlファイルをそのままレンダリングすることもできますか?

  7. 7

    Dockerコンテナーを使用したGolang Webアプリの静的ファイルのデプロイ

  8. 8

    スリムテンプレートを使用したSinatra--cssファイルにリンクできません:テンプレートファイルからパブリックディレクトリのcssファイルへのパスは何ですか?

  9. 9

    ポリモーフィズムとポインターを使用した構造体によるキャスト

  10. 10

    docker-compose ファイルは、コンテナー ディレクトリ内の dockerfile によって抽出されたファイルを削除します

  11. 11

    @MappedSuperclassアノテーションを使用したHibernateエンティティポリモーフィズム

  12. 12

    ステップEXECスポーンで失敗しました:そのようなファイルまたはディレクトリはありません

  13. 13

    テンプレート/ポリモーフィズム

  14. 14

    サンドボックスファイルシステムのディレクトリのファイルをChromeアプリでユーザーが選択したディレクトリに保存または書き込みます

  15. 15

    サンドボックスファイルシステムのディレクトリのファイルをChromeアプリでユーザーが選択したディレクトリに保存または書き込みます

  16. 16

    ポリモーフィズムまたはプロパティの辞書?

  17. 17

    Kubernetesは、コンテナ内のファイルを使用して既存のディレクトリにボリュームをマウントします

  18. 18

    Enterprise LibraryLoggingファイルリスナーのファイル名にテンプレートまたはトークンを指定する方法

  19. 19

    Java 8を使用したポリモーフィズムのリファクタリング

  20. 20

    NTFS(または任意のファイルシステム)は、パーティション外のファイルをサポートしていますか?

  21. 21

    明示的なポリモーフィズムスローを使用したクラス階層ごとのHibernateテーブルは、リフレクション値を取得できません

  22. 22

    Jackson を使用した JSON ファイルのポリモーフィックなデシリアライズ

  23. 23

    ポリモーフィズムを使用したMySQL結果のフィルタリング

  24. 24

    同じ署名を持つメンバー関数を呼び出すために、関数テンプレートインスタンスの代わりに継承とポリモーフィズムを使用するのはなぜですか?

  25. 25

    インターフェイスとクラスを使用したポリモーフィズム

  26. 26

    Pythonを使用して、選択した複数のjsonファイルをファイルディレクトリからインポートします

  27. 27

    Chromeファイルシステムを使用して、ユーザーが選択したディレクトリ内にファイルを作成します

  28. 28

    ディレクトリ内のサブフォルダをループし、.CSVファイルから指定された列をインポートします

  29. 29

    ラズベリーパイ4(arm64 / armv8)で実行するためのコンテナー化されたrustアプリケーションのコンパイル。「そのようなファイルまたはディレクトリはありません」を実行できません

ホットタグ

アーカイブ