この方法の特徴をあげよう。
メリット
さて、例を見てみよう。
次のような部品があるものとする。
これを、「ウィンドウ」、「ボタン」、「メニュー」、「通常」、「枠付」、「影付」の 6つのクラス(n+m)でやろうというのが、動的継承である。 (まあ、常識で考えると「通常」はいらないかもしれないが。)
具体的にちょっと書いてみよう。
struct Widget {
virtual void Draw();
};
struct Window : Widget {
void Draw(){ ... /* ウィンドウを描く */ }
};
struct Border : Widget {
Widget* m_p;
Border(Widget* p) : m_p(p) {}
void Draw(){ p->Draw(); ... /* 枠も描く */ }
};
Window w;
Widget* p = new Border(&w); // これが動的継承
p->Draw();
Widget* p2 = new Shadow(p);
p2->Draw(); // 枠も影も描く
(上のプログラムでは、雰囲気だけ分かるように手を抜いてある。)個人的には、何らかのインタープリタを実装するとき役に立つかもしれないと思っている。