これがわかれば合格(!?)プログラム

  • 「どのプログラミング言語にも、その言語をマスターした証となるようなプログラムがある」

IT企業の新入社員向けセミナーなどで活躍されているベテランプログラマの矢沢久雄さんは、こう言います。

情報システムやアプリケーションの開発に使われるプログラミング言語には、その時々で「よく使われる言語」⁠そうでもない言語」があります。開発案件によっては、もろもろの事情により、特定の言語を使わなければいけないケースもあります。また、プログラミング言語自体も新たなものが生み出されていきます。

プログラミングを職業とする方にとって、プログラミング言語は、1つ修めれば終わりなものではなく、⁠〇〇のことはある程度わかった。いつまでも〇〇にとどまっていないで、今度は△△に挑戦しよう」と、スムーズに手を広げていくことが求められるものです。

次の言語へと手を広げていくときのきっかけとなるようなプログラムが、冒頭の「その言語をマスターした証となるようなプログラム」です。たとえば、プログラミングを始めるときに、最初に選択する言語として根強い人気があるC言語の場合。矢沢さんは、1つの例として「自己参照構造体を使ったテキストエディタ」のプログラムを挙げます。

テキストエディタでは、テキストファイルの行のつながりをリスト構造で表します。C言語では、リスト構造を、構造体のメンバに同じ構造体のポインタを含めるという方法で実装します(自己参照構造体と言います⁠⁠。このリスト構造を実現できる人は、C言語のキモである構造体とポインタがバッチリわかっている人です。ですから、⁠自己参照構造体を使ったテキストエディタ」を完成させられる人は、C言語はほぼOKだろう、となるわけです。

C++ならどんなプログラム?

では、C言語に機能を追加して生まれた言語C++ではどうでしょうか。C++は、オブジェクト指向プログラミング言語です。オブジェクト指向プログラミング言語ではクラスを使います。クラスは、C言語の構造体を発展させたものと言ってもいいでしょう。クラスの最大の特徴は、クラスが持っているメンバ(変数と関数)を別のクラスに引き継げること。これを継承と言います。

オブジェクト指向プログラミング言語であるC++で、1つ上のステップに到達できたと言えるプログラムでは、⁠メンバ関数のオーバーライドによる多態性のメリット」を生かします。

なにやら難しそうな言葉が出てきました。まず、⁠メンバ関数」はクラスが持つ関数のことです。構造体がメンバに変数を持つように、クラスは変数と関数をメンバに持ちます。

オーバーライドは、クラスが持つメンバ関数の処理内容を、そのクラスを継承した別のクラスで上書きすること。多態性は、クラスを使う人からしてみると同じメンバ関数を呼び出しているように思えるのに、実際には状況に応じて異なるメンバ関数が呼び出されることです。同じメンバ関数なのに異なる処理が行われるので、多態(たたい)だというわけです。

さて、前述の矢沢久雄さんが上梓した新刊新・標準プログラマーズライブラリ C++ クラスと継承 完全制覇では、⁠メンバ関数のオーバーライドによる多態性のメリット」を生かしたプログラム例として⁠お絵かきプログラム⁠を扱っています。⁠お絵かき⁠といっても、グラフィックデータを扱うわけではなく、ごく簡易的に文字の⁠○⁠⁠△⁠⁠□⁠を図形に見立てて表示します。そのプログラムの実行結果は次のようになります。

○△△□□□
○△□□□

1行目には⁠△⁠が2つありますが、2行目では⁠△⁠が1つになっています。もう少し正確に言うと、まず1行目では6つの図形(○△△□□□)を描画しています。次に、先頭から3つ目の図形(△)を削除して、その結果を再描画しています(○△□□□⁠⁠。

拍子抜けするくらい簡単ですね。しかしながら、実は、この簡単な処理を実行しているプログラムには、⁠メンバ関数のオーバーライドによる多態性のメリット」のエッセンスがギュっと詰まっているのです。

「いったいどういうこと?」と気にとまった方がいらしたら、⁠C++ クラスと継承 完全制覇』を覗いてみてください。本の中では詳しく、かつクリアに解説しています。