多型は、関連するタイプのオブジェクトが同じに扱うことができるようにすることで、コードの再利用を可能にします。
あなたは異なる動作をサブクラスの数十を必要とするかもしれないことを考えてみましょう:
struct Shape1: public Shape { /* .. */ }; // triangle
struct Shape2: public Shape { /* .. */ }; // rectangle
// ...
struct ShapeN: public Shape { /* .. */ }; // projection of rhombic triacontahedron
はあなたがShape
ポインタの配列が指すオブジェクトを処理する必要があるかもしれないことを考えてみましょう。多型と
、あなたは単一のベクターを必要とし、仮想関数を持つ単一のループが呼び出されます:
std::vector<Shape*> v = get_shape_vector();
for(Shape* s : v)
s->draw();
多型がなければ、あなたはタイプごとに別々の配列を管理し、それらを別々に処理しているだろう:
std::vector<Shape1> v1 = get_shape1_vector();
std::vector<Shape2> v2 = get_shape2_vector();
// ...
std::vector<ShapeN> vN = get_shapeN_vector();
for(Shape1& s : v1)
s.draw();
for(Shape2& s : v2)
s.draw();
// ...
for(ShapeN& s : vN)
s.draw();
多型を使用するコードの3行は、多型を使用しないコードの3行目よりも保守が簡単です。
プロセスを変更する必要がある場合があることを考慮してください。おそらく、描画の前に関数呼び出しを追加したいと思うかもしれません。
void pre_draw(Shape*);
for(Shape* s : v) {
pre_draw(s);
s->draw();
}
は多型がなければ、あなたはダースのそれぞれの機能の数十を定義および変更する必要がありますループ:
void pre_draw1(Shape1&);
void pre_draw2(Shape2&);
// ...
void pre_drawN(ShapeN&);
for(Shape1& s : v1) {
pre_draw1(s);
s.draw();
}
for(Shape2& s : v1) {
pre_draw2(s);
s.draw();
}
// ...
for(ShapeN& s : v1) {
pre_drawN(s);
s.draw();
}
は後でシェイプを追加することが考えてみましょう、あなたの側で多型を持っているとき、これは簡単です。多態性では、新しいタイプと仮想関数を定義するだけで済みます。配列にポインタを追加するだけで、他のすべての互換型のオブジェクトと同様に処理されます。
struct ShapeN1: public Shape { /* .. */ }; // yet another shape
ポリモーピズムがなければ、新しいタイプを定義するだけでなく、新しいタイプを作成する必要があります。新しいpre_draw
関数を作成する必要があります。そして、それらを処理するために新しいループを追加する必要があります。
void pre_drawN1(ShapeN1&);
// ...
std::vector<ShapeN1> vN1 = get_shapeN1_vector();
// ...
for(ShapeN1& s : vN1) {
pre_drawN1(s);
s.draw();
}
実際に、それぞれのシェイプタイプが処理される場所については、コードベース全体を調べてそこに新しいタイプのコードを追加する必要があります。
ここでNは小さくても大きくてもかまいません。 Nが大きいほど、多型の反復は避けられます。しかし、あなたが持っているサブクラスの数にかかわらず、新しいサブクラスを追加するときにコードベース全体を調べる必要はありません。
あなたのケースに新しいポインタを入れる必要はありません。しかし、それは「多形性の必要性」とは無関係です。 – juanchopanza
仮想関数のポイントは、実行時に振る舞いを定義し、オブジェクトを動的に使用できるようにすることです。多態性はこれに与えられた名前です。 – Lawrence
たとえば、図形のコレクションを作成することができます。 '' '' std :: vector '' 'を考えてみましょう。それは異なる形を含むかもしれませんが、あなたはそれらのすべてに共通のことをすることができます。 –
isapego