動的バインディングを通じてポリモーフィズムを実現すると、仮想関数は、関数が基本クラスによって宣言されている場合でも、派生クラス オブジェクトが独自のバージョンの仮想関数を呼び出すことができます。具体的には、仮想関数は基本クラスで宣言され、virtual キーワードを使用します。コンパイラは、仮想ポインタ テーブルを使用して、ランタイム オブジェクト タイプの関数実装を動的に検索します。派生クラス オブジェクトは、基本クラスによって宣言されている場合でも、常に独自のバージョンの仮想関数を呼び出します。
C++ ポリモーフィズムにおける仮想関数の役割
オブジェクト指向プログラミング (OOP) では、ポリモーフィズムは、オブジェクトが同じメソッド呼び出しにさまざまな方法で応答できるようにする機能です。 C++ では、仮想関数は動的バインディングを通じてポリモーフィズムを実現します。
仮想関数とは何ですか?
仮想関数は、基本クラスで宣言され、派生クラスによってオーバーライドされるメンバー関数です。基本クラスで仮想関数を宣言する場合は、virtual
キーワード プレフィックスを使用します。 virtual
关键字前缀。
虚函数的工作原理
当调用虚函数时,编译器不会查找基类中的函数实现。相反,它会查找运行时对象类型的函数实现。这意味着子类对象始终调用其自身版本的虚函数,即使该函数是由基类声明的。
虚指针表
虚函数调用涉及称为虚指针表的特殊数据结构。对于每个具有虚函数的类,编译器都会创建一个虚指针表,其中包含指向该类虚函数的指针。当创建派生类对象时,该对象包含指向其自身虚指针表的指针。
实战案例
考虑以下示例:
class Shape { public: virtual void draw() const = 0; // 其他函数和变量 }; class Rectangle : public Shape { public: void draw() const override { // 绘制一个矩形 } }; class Circle : public Shape { public: void draw() const override { // 绘制一个圆 } }; int main() { Shape* shapes[] = {new Rectangle(), new Circle()}; for (Shape* shape : shapes) { shape->draw(); // 根据运行时类型调用正确的 draw() 方法 delete shape; } }
在这个示例中,Shape
类声明了一个虚函数 draw()
。派生类 Rectangle
和 Circle
重写了 draw()
方法以提供针对特定形状的自定义实现。在 main()
函数中,我们创建了一个形状数组并对每个形状调用 draw()
方法。尽管所有形状都声明为基类类型,但它们会根据实际运行时类型调用正确的 draw()
Shape
クラスが仮想関数 draw()
を宣言します。派生クラス Rectangle
と Circle
は、draw()
メソッドをオーバーライドして、特定の形状のカスタム実装を提供します。 main()
関数では、シェイプの配列を作成し、シェイプごとに draw()
メソッドを呼び出します。すべての形状は基本クラス型として宣言されていますが、実際のランタイム型に基づいて正しい draw()
メソッドを呼び出し、C++ でポリモーフィズムを実現する仮想関数の力を示しています。 🎜以上がC++ のポリモーフィズムにおいて仮想関数はどのような役割を果たしますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。