ホームページ  >  記事  >  バックエンド開発  >  C++ 関数のオーバーロードは仮想関数でどのように機能しますか?

C++ 関数のオーバーロードは仮想関数でどのように機能しますか?

WBOY
WBOYオリジナル
2024-04-13 11:12:02468ブラウズ

関数のオーバーロードと仮想関数を併用すると、親クラスの動作を変更することなく、サブクラスが同じ操作のさまざまな側面をさまざまな方法で実装できるようになります。親クラスで仮想関数を宣言し、子クラスでそれらをオーバーロードすることにより、動的なポリモーフィズムを実現でき、親クラスの参照を通じてさまざまな子クラスの特定の関数を呼び出すことができます。

C++ 函数重载如何与虚函数结合使用?

#C 関数のオーバーロードと仮想関数の組み合わせ

オーバーロードと仮想関数について

  • オーバーロード: 同じ名前を持つ関数ですが、パラメーター リストが異なります。
  • 仮想関数: 親クラスで virtual として定義されたメンバー関数を使用すると、サブクラスでその実装を再定義できます。

関数のオーバーロードと仮想関数の組み合わせ

C により、仮想関数の使用時にメンバー関数をオーバーロードできます。これにより、サブクラスは、親クラスの動作を変更することなく、同じ操作のさまざまな側面をさまざまな方法で実装できます。

実装

親クラスで仮想関数を宣言します:

class Parent {
public:
    virtual void doSomething();
};

サブクラスで仮想関数をオーバーロードします:

class Child : public Parent {
public:
    @Override
    void doSomething() {
        // 子类的特定实现
    }
};

実際的なケース

次のシナリオを考えてみましょう:

  • draw を定義する Shape 親クラスがあります。 virtual 図形を描画する関数。
  • には
  • CircleRectangle という 2 つのサブクラスがあり、どちらも独自の描画方法を持っています。

コード実装:

class Shape {
public:
    virtual void draw() = 0;   // 纯虚函数,强制子类实现
};

class Circle : public Shape {
public:
    @Override
    void draw() {
        // 绘制圆的具体实现
    }
};

class Rectangle : public Shape {
public:
    @Override
    void draw() {
        // 绘制矩形的具体实现
    }
};

int main() {
    vector<Shape*> shapes;

    shapes.push_back(new Circle());
    shapes.push_back(new Rectangle());

    for (Shape* shape : shapes) {
        shape->draw();  // 调用适当的重载函数
    }

    return 0;
}

このようにして、動的多態性メソッドを作成できます。これにより、親クラスのポインターまたは参照を使用して特定の関数を呼び出すことができます。異なるサブクラス。

以上がC++ 関数のオーバーロードは仮想関数でどのように機能しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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