C++ の仮想関数のコストについて不満を言う人をよく見かけます。しかし、同じ人々は Java のランタイム ポリモロヒズムについて否定的なことは何も言いません。
C++ で開発されたアプリケーションをホストするランタイムを C++ で開発する必要がある場合は、次のアプローチを取ります。
- 「抽象」アプリケーションを表す仮想メソッドを持つ基本クラスがあります。これは、アプリケーションの実行時のビューです。アプリ開発者は基本クラスを継承し、アプリケーションを動的にロード可能な共有ライブラリにコンパイルします。
- ランタイムからの「サービス」を表す仮想メソッドを持つ基本クラスがあります。ランタイムはこれらのサービスを実装します。アプリケーションは、これらのインターフェイス クラスを通じてこれらのサービスを使用します。ランタイムはアプリケーションの動的ライブラリをロードし、そのサービスの実装オブジェクトでアプリケーションを初期化します。
アプリケーションとランタイムの両方が互いのハンドルを持ち、仮想メソッド呼び出しを使用して互いに呼び出します。はい、コストがかかりますが、これによりランタイムからアプリを切り離すこともできます。仮想メソッドがない場合、アプリは常にランタイムとのリンク時間依存性を持ちます。
次に、Java で同様のケースを考えてみましょう。Java にも実装が必要なインターフェースがあり、関連するランタイム ポリモーフィズムにも同様のコストがかかるはずです。
Java ランタイム ポリモヒズムに関する私の理解は正しいですか?
また、Java にもコストがかかる場合、なぜ c++ は常に「ああ、仮想関数のコストがあり、仮想関数を使用してアプリケーションの一部を分離するアプローチは確かに悪い」という怒りのコメントを受け取ります。Javaの場合、これらの人々はどこに行きますか? 彼らは何も言わない。
私の質問は、そのようなコメントをどのように処理するかです。C ++を支持する合理的な議論は何ですか?