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++言語においての役割は全く同じです。
protected
制御子と呼ばれています。
class CEnemy
{
private:
int hardness; //耐久性
int score; //得点
protected:
void SetScore(int val);
public:
CEnemy(); //コンストラクタ
void SetHardness(int val);
};
protected
タイプにしてしまうと、子クラスであるCEnemy2内では普通に使用できる一方、main関数やCEnemyと親子関係にないクラスの関数からは、SetScore()関数を利用することができなくなります。
class CEnemy2 : protected CEnemy
{
private:
int x, y; //現在の位置
public:
CEnemy2();
void Move();
};
protected
は、上記のように用いることもできます。このとき、親クラスのpublic
定義の変数・関数は、子クラスではprotected
とみなされます。やはり親クラスのprivate
へは、子クラスからアクセスはできません。