ホームページ  >  記事  >  バックエンド開発  >  STL 関数オブジェクトはポリモーフィズムをサポートしていますか?どのように達成するか?

STL 関数オブジェクトはポリモーフィズムをサポートしていますか?どのように達成するか?

王林
王林オリジナル
2024-04-25 10:39:01709ブラウズ

STL 関数オブジェクトは、次のように実装されるポリモーフィズムをサポートします。仮想関数と仮想継承を使用して、抽象基本クラスとその派生クラスを定義します。派生クラスごとに関数の特定のバージョンを定義します。具体的なクラスをパラメーターとしてアルゴリズムに渡します。

STL 函数对象是否支持多态性?如何实现?

#STL 関数オブジェクトはポリモーフィズムをサポートしていますか?

標準テンプレート ライブラリ (STL) の関数オブジェクトは実行時ポリモーフィズムをサポートしており、プログラムの実行中にどの関数を呼び出すかを動的に決定できます。

実装方法:

仮想関数と仮想継承を利用することで、多態性の関数オブジェクトを実装できます。

コード例:

次の例を考えてみましょう。ここでは、抽象基本クラス Shape が純粋仮想関数 area( ):

struct Shape {
  virtual double area() const = 0;
};

Shape から派生した具体的なクラス (CircleSquare など) は、その特定のバージョン area を定義します() 関数:

struct Circle : public Shape {
  double radius;

  Circle(double radius) : radius(radius) {}

  double area() const override {
    return M_PI * radius * radius;
  }
};

struct Square : public Shape {
  double side_length;

  Square(double side_length) : side_length(side_length) {}

  double area() const override {
    return side_length * side_length;
  }
};

これらの具象クラスは、関数オブジェクトを使用してアルゴリズムに引数として渡すことができます:

std::vector<Shape*> shapes{new Circle(2), new Square(3)};

double total_area = 0;
for (const auto& shape : shapes) {
  total_area += shape->area();
}

std::cout << "Total area: " << total_area << std::endl;

この例では、shapes 別のオブジェクトへのポインターも使用できます。 Shape 派生クラスが保存され、多態性関数オブジェクトも正しい area() 関数を呼び出します。

実際的なケース:

ポリモーフィック関数オブジェクトは、動的スケジューリングや疎結合コードで非常に役立ちます。例:

  • グラフィックス ライブラリ,Shape クラスは、さまざまな種類のグラフィックスを表すことができます。多態性関数オブジェクトを使用すると、グラフィックス コードを変更せずに領域を描画および計算できます。
  • データベース アプリケーションでは、接続クラスはさまざまな種類のデータベース接続を抽象化できます。多態性関数オブジェクトを使用すると、クエリと更新を透過的に実行できます。

以上がSTL 関数オブジェクトはポリモーフィズムをサポートしていますか?どのように達成するか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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