派生クラスの説明
先週の問題提起をうけて、その解決手段でもある派生クラスについて説明する。
// 基本となるクラス // ⇒ "基底クラス" ("親クラス"と呼ぶ場合もある) class Person { private: char name[20] ; int age ; public: Person( char s[] , int a ) { strcpy( name , s ) ; age = a ; } void print() { printf( "name=%s , age=%d\n" , name , age ) ; } } ; // Personのデータにbukaをちょっとだけ加えたクラス // ⇒ 派生クラス(導出クラスと呼ぶ場合もある。) class Joshi : public Person { private: Person* buka ; public: // 上司のデータ構造のコンストラクタ Joshi( char s[] , int a , Person* b ) : Person( s , a ) , // 上司の名前と年齢を初期化 buka( b ) // 部下の情報を保存 {} void print() { Person::print() ; // Joshiの名前と年齢を // Personのデータとして表示 buka->print() ; // 部下の情報を表示 } } ; int main() { Person saitoh( "T-Saitoh" , 44 ) ; saitoh.print() ; Joshi ashida( "Ashida Noboru" , 55 , &saitoh ) ; ashida.print() ; // 上司の情報と部下の情報がペアで表示される。 // テーブルという配列に、saitohとashidaを登録。 // table[]は、「Personへのポインタ」の配列。 Person* table[2] ; table[0] = &saitoh ; table[1] = &ashida ; // table[]に格納された、saitohとashidaを表示する。 for( int i = 0 ; i < 2 ; i++ ) table[i]->print() ; // ただし、table[1] に代入する時点で、Joshi は Person に // 降格させられているので、部下の情報は表示されない。 }
プロジェクタ&エディタそのままで
いつもは、ホワイトボードにコードを書きながら説明を行っているが、 今日はEmacsを24ポイント表示にして、直接コードを入力しながらの説明を行った。 すぐにプログラムを実行した結果を見せながらだったので、ある意味便利。 しかしながら、継承の説明の前に、Joshi::print() を書いたコードを示し、 説明の順序を間違えた点で反省。
プロジェクタの説明では、エディタでスクロール移動をしすぎると、どこを見るべきか 追従できずに不満がでるだろうと、注意しながら…と思っていたが、 やっぱり画面移動が激しくなってしまった。 試験的に、プロジェクタを使ってみたけど、あまり巧い使い方ではなかったと反省。 「学生さんからは、この資料印刷して…」と頼まれたけど、 『そのまま日記にあげておく…』と説明する。