クラスが、関数つきのポインタに見えるのは、
C++が、Cの構造を引きずっているために、
そう表現するのが手っ取り早かったというこ
とにすぎません。
さて、オブジェクト指向的な意味での、クラ
スは、例えば、「犬」という抽象的な概念を
具体的な、「ぽち」とか、「はち」という概
念に具象化する機能です。
さて、ここで、この機能が意味を持つのは、
犬が複数存在することが必要です。
世界に「ぽち」という犬しかいなかった場合、
ある性質が「犬」のものなのか、「ぽち」の
ものなのか区別することはできません。
世界に、山ほどの犬がいるから、共通の性質
は「犬」の性質として抽象化できるわけです。
さて、こういう意味を持っているので、プロ
グラムの中で、同じようなものが複数でてこ
ないと、クラスのありがたみは、あまりあり
ません。
例えばシューティングゲームで、敵が一台し
かいない場合、
enemy_move(int x, int y); // 動くとか
enemy_attack(int w); // パワー w で攻撃してくるとか
enemy_blast(); // 爆発するとか
そういう関数を定義すればいいわけです。
でも、敵が何台もいる場合、
enemy boss(is_boss);
enemy soldier_a(is_soldier);
enemy soldier_b(is_soldier);
enemy soldier_c(is_soldier);
と、ボスや、手下の属性で定義しておけば、
boss.move(10, 10);
soldier_a.move(10, 10);
としたときに、どちらも、「敵」なので、
敵としてふさわしい動きさせて、なおかつ、
boss はボスらしく、soldier_a は、手下
らしく動く(スピードが違うかもしれない)
また、
boss.attack(10); と、
soldier_a.attack(10); は、
同じように攻撃してくるでしょうけれど、
威力が違ったり、武器が違ったりするかも
しれません。
このように、取り扱う対象が複数になって
くると、クラスのありがたみはとても大き
くなります。
あと、上記では、説明のために、bossも
soldier も、同じ enemy で定義していま
すが、そもそも、敵だと言っても、ボスと
手下じゃ根本的に違うというのが普通なの
で、その場合、「継承」というテクニック
で、
enemy class から、boss class を派生させる
enemy class から、soldier class を派生させる
というのが普通です。
また、手下が 100人ぐらいいるという場合、
当然、手下クラスの配列を100個生成する
ということもできます。
お礼
読んでいて感じたのですが、クラスは構造体よりもずっと抽象的ですね。そして属性と動作をまとめておけると便利そうです。 回答ありがとうございました!