Cの多型は、いくつかの手法を通じて実装できますが、最も一般的なものは仮想関数と動的発送です。これらの方法の詳細な内訳は次のとおりです。
仮想関数:
仮想関数は、多型を可能にするCの基本的な特徴です。これらは、派生クラスでオーバーライドできる基本クラスで宣言された関数です。仮想関数がポインターまたは基本クラスへの参照を介して呼び出される場合、適切な派生クラス関数は、実行時に実際のオブジェクトタイプに基づいて呼び出されます。仮想関数を宣言するには、ベースクラスのvirtual
キーワードを使用し、オプションで派生クラスのoverride
キーワードを使用して、ベースクラスのメソッドをオーバーライドしていることを示します。
例:
<code class="cpp">class Base { public: virtual void show() { cout show(); // Outputs: Derived function return 0; }</code>
ダイナミックディスパッチ:
Runtime Dispatchとも呼ばれる動的ディスパッチは、仮想関数呼び出しの根底にあるメカニズムです。これにより、関数を呼び出すために使用されるポインターまたは参照のタイプではなく、オブジェクトのタイプに応じて、実行時に正しい関数を呼び出すことができます。これは、仮想テーブル(Vtable)と仮想ポインター(VPTR)を使用することで実現されます。 Vtableには、仮想関数の実際の実装へのポインターが含まれており、VPTRはオブジェクトのクラスの適切なVtableを指します。
例:
<code class="cpp">class Shape { public: virtual void draw() = 0; // Pure virtual function }; class Circle : public Shape { public: void draw() override { cout draw(); // Dynamic dispatch at work } return 0; }</code>
Cの仮想関数は、それを呼び出すために使用されるポインターまたは参照のタイプではなく、実行時に実際のオブジェクトタイプに基づいて正しい関数を呼び出すことにより、プログラムが正しい関数を呼び出すことにより、ランタイム多型を実現するために使用されます。これが機能する方法です:
virtual
として宣言されます。これは、この関数が派生クラスでオーバーライドされる可能性があることを示しています。override
キーワードを使用して、基本クラスのメソッドをオーバーライドしていることを示すことにより、仮想関数をオーバーライドできます。これを説明する例は次のとおりです。
<code class="cpp">class Animal { public: virtual void sound() { cout sound(); // Runtime polymorphism at work } return 0; }</code>
この例では、 sound()
関数は、基本クラスのポインターを介して呼び出しが行われている場合でも、実際のオブジェクトタイプ( Dog
またはCat
)に基づいて多型に基づいて呼ばれます。
ダイナミックディスパッチは、関数呼び出しのランタイム解像度を有効にすることにより、Cの多型を実装する上で重要な役割を果たします。それがどのように機能するかとその重要性は次のとおりです。
たとえば、コードスニペットでは、以前に提供されています。
<code class="cpp">Shape* shapes[] = {new Circle(), new Square()}; for (int i = 0; i draw(); // Dynamic dispatch at work }</code>
draw()
関数はShape
ポインターを介して呼び出されますが、実際の機能は実行されます( Circle::draw()
またはSquare::draw()
)は、動的ディスパッチのおかげでオブジェクトタイプに基づいて実行時に決定されます。
Cの仮想関数を介して多型を使用すると、いくつかの重要な利点があり、コードの柔軟性と保守性を高めます。
要約すると、Cの仮想関数を介して多型を使用すると、優れたソフトウェアデザインの特徴である、より柔軟で保守可能な、拡張可能なコードにつながります。
以上がC(仮想関数、動的ディスパッチ)に多型を実装するさまざまな方法は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。