3

キーワードvirtualが基本クラスをポリモーフィックにすることはわかっています。オブジェクトを作成して を呼び出すとvirtual function、実行時の割り当てに基づいて対応する関数が呼び出されますが、異なるタイプのオブジェクトを作成する必要があるのはなぜですか。つまり

Base *ptr = new Derived;

ptr->virtualfunction(); //calls the function which has implemented in Derived class.

そのようにオブジェクトを作成すると

Derived *ptr = new Derived; 
ptr->virtualfunction(); // which does the same without the need of making the function virtual.
4

3 に答える 3

8

異なるタイプのオブジェクトを一緒に保存したい場合があるため:

std::vector<std::unique_ptr<Base>> v;

v.push_back(make_unique(new DerivedA()));
v.push_back(make_unique(new DerivedB()));
v.push_back(make_unique(new DerivedC()));

今、あなたがそれを超えたらvector

for (auto& p : v) {
    p->foo();
}

foo()DerivedA、B、C を適切に呼び出します。

于 2013-06-28T11:15:09.337 に答える
2

簡単な例を見てみましょう:あなたが持っているとしましょう

class Base {};
class Derived1 : public Base {};
class Derived2 : public Base {};

ここで、Derived1 と Derived2 の両方のインスタンスをベクター (または任意のコンテナー) に格納できるようにしたいとします。その場合、基本クラスを使用する必要があります。

std::vector<Base*>
// or std::vector<std::unique_ptr<Base>>
于 2013-06-28T11:16:21.980 に答える
1

ポリモーフィズムの必要性とは、異なるデータを同じ方法で処理する必要性です。異なる形状のデータセットに対して同じアルゴリズムを何度も再実装するよりも、そのアルゴリズムを 1 つだけ実装して、異なる演算子でパラメーター化する方がはるかに簡単ではないでしょうか?

それがポリモーフィズムの本質です。アルゴリズムから開始し、対話する必要があるインターフェイスを確立してから、そのインターフェイスの実装を構築します。C++ では、インターフェイスの概念はすべてのクラスで暗黙的です。どのクラスも 1 つのインターフェイスを公開し (ただし、その祖先を通じて多くのインターフェイスをサポートする場合があります)、その子孫もそれを実装します。特定のメソッドを仮想化することにより、子孫は、オブジェクトが外部から操作される方法を変更することなく、それらをオーバーライドして独自の内部構造に適応させることができます。

したがって、ポリモーフィズムとは、実際には、さまざまな形状を採用する可能性のある値であり、それらに均一にアクセスして操作する手段です。あなたの質問に答える際の重要なポイントは、おそらく、アルゴリズムが操作している実装を認識していないことです。のインスタンスで動作することをコードが認識しているため、Derivedそのメソッドを直接呼び出すことができる簡単な例を提供します。一般的なコード、またはインターフェイスを参照するコード (いわば) では、その知識は存在しないため、コードは基本クラスのメソッドに依存せざるを得なくなります (また、プログラマーは、そのコードで使用する予定のクラスが確実に使用されるようにする必要があります)。明確に定義されている - つまり仮想 - 必要な場合)。

ポリモーフィズムには多くの有用なアプリケーションがありますが、それらはすべて上記の原則から派生しています。

  • 異種データセット(他の回答で示されているように)、
  • インジェクション(同じインターフェースの異なる実装が実行時に別のものに交換される可能性がある)、
  • テスト (より具体的には、特定のクラス C と対話するクラスが、C の正しい動作をテストするのに役立つダミーに置き換えられるモック)、

いくつか挙げると。コンパイル時のポリモーフィズム (テンプレート) と実行時のポリモーフィズム (virtualメソッドと継承) はどちらも、方法や長所と短所は異なりますが、その目標を達成することに注意してください。

于 2013-06-28T13:30:56.740 に答える