5:子どもに見せたくありません!

 なぜ、SetScore()関数がエラーの対象になってしまうのでしょうか。それは、親クラスでは
public
扱いだった変数・関数が、子クラスにおいて継承されたときに
private
扱いになってしまう。つまり、SetScore()関数がCEnemy2においては
private
な関数であったため、アクセスが拒否されてしまったのです。
 このトラブルは、親クラスの前に
public
を付け加え、子クラスに「親クラスにある
public
な変数・関数は、子どもも見てもいいよ」と伝えることで解決できます。ただし、親クラスの
private
な情報だけは、
public
が許されている子クラスでも、決してみることはできません。
class CEnemy2 : public CEnemy
{
private:
    int x, y;        //現在の位置
public:
    CEnemy2();
    void Move();
};
 ちなみに、「
class
CEnemy2 : CEnemy」と、親クラスの前に何も記述しないのと、「
class
CEnemy2 :
private
CEnemy」と、先頭に
private
を記述するのは、C++言語においての役割は全く同じです。
 一方、「自分(親クラス)と息子(子クラス)たちは見てもいいけれど、他の人には決して見せたくない!」変数・関数を宣言するキーワードもC++には用意されています。それは
protected
制御子と呼ばれています。
class CEnemy
{
private:
    int hardness;    //耐久性
    int score;        //得点
protected:
    void SetScore(int val);
public:
    CEnemy();        //コンストラクタ
    void SetHardness(int val);
};
 例えば、このようにSetScore()関数を
protected
タイプにしてしまうと、子クラスであるCEnemy2内では普通に使用できる一方、main関数やCEnemyと親子関係にないクラスの関数からは、SetScore()関数を利用することができなくなります。
class CEnemy2 : protected CEnemy
{
private:
    int x, y;        //現在の位置
public:
    CEnemy2();
    void Move();
};
 
protected
は、上記のように用いることもできます。このとき、親クラスの
public
定義の変数・関数は、子クラスでは
protected
とみなされます。やはり親クラスの
private
へは、子クラスからアクセスはできません。