ホームページ  >  記事  >  バックエンド開発  >  C++ のポリモーフィズムにおいて仮想関数はどのような役割を果たしますか?

C++ のポリモーフィズムにおいて仮想関数はどのような役割を果たしますか?

王林
王林オリジナル
2024-06-05 20:55:001157ブラウズ

動的バインディングを通じてポリモーフィズムを実現すると、仮想関数は、関数が基本クラスによって宣言されている場合でも、派生クラス オブジェクトが独自のバージョンの仮想関数を呼び出すことができます。具体的には、仮想関数は基本クラスで宣言され、virtual キーワードを使用します。コンパイラは、仮想ポインタ テーブルを使用して、ランタイム オブジェクト タイプの関数実装を動的に検索します。派生クラス オブジェクトは、基本クラスによって宣言されている場合でも、常に独自のバージョンの仮想関数を呼び出します。

C++ 中虚函数在多态性中扮演什么角色?

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()。派生类 RectangleCircle 重写了 draw() 方法以提供针对特定形状的自定义实现。在 main() 函数中,我们创建了一个形状数组并对每个形状调用 draw() 方法。尽管所有形状都声明为基类类型,但它们会根据实际运行时类型调用正确的 draw()

🎜仮想関数の仕組み🎜🎜🎜仮想関数が呼び出されるとき、コンパイラは基本クラス内の関数実装を検索しません。代わりに、ランタイム オブジェクト タイプの関数実装を検索します。これは、関数が基本クラスによって宣言されている場合でも、サブクラス オブジェクトは常に独自のバージョンの仮想関数を呼び出すことを意味します。 🎜🎜🎜仮想ポインタテーブル🎜🎜🎜仮想関数呼び出しには、仮想ポインタテーブルと呼ばれる特別なデータ構造が関係します。仮想関数を持つクラスごとに、コンパイラは、クラスの仮想関数へのポインタを含む仮想ポインタ テーブルを作成します。派生クラス オブジェクトが作成されると、そのオブジェクトには独自の仮想ポインター テーブルへのポインターが含まれます。 🎜🎜🎜実際のケース🎜🎜🎜次の例を考えてみましょう: 🎜rrreee🎜 この例では、Shape クラスが仮想関数 draw() を宣言します。派生クラス RectangleCircle は、draw() メソッドをオーバーライドして、特定の形状のカスタム実装を提供します。 main() 関数では、シェイプの配列を作成し、シェイプごとに draw() メソッドを呼び出します。すべての形状は基本クラス型として宣言されていますが、実際のランタイム型に基づいて正しい draw() メソッドを呼び出し、C++ でポリモーフィズムを実現する仮想関数の力を示しています。 🎜

以上がC++ のポリモーフィズムにおいて仮想関数はどのような役割を果たしますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。