クラスまみれのゲームプログラミング入門

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

 なぜ、SetScore()関数がエラーの対象になってしまうのでしょうか。それは、親クラスではpublic扱いだった変数・関数が、子クラスにおいて継承されたときにprivate扱いになってしまう。つまり、SetScore()関数がCEnemy2においてはprivateな関数であったため、アクセスが拒否されてしまったのです。

 このトラブルは、親クラスの前にpublicを付け加え、子クラスに「親クラスにあるpublicな変数・関数は、子どもも見てもいいよ」と伝えることで解決できます。ただし、親クラスのprivateな情報だけは、publicが許されている子クラスでも、決してみることはできません。

publicclass.cpp
class CEnemy2 : public CEnemy
{
private:
	int x, y;		//現在の位置
public:
	CEnemy2();
	void Move();
};

 ちなみに、「class CEnemy2 : CEnemy」と、親クラスの前に何も記述しないのと、「class CEnemy2 : private CEnemy」と、先頭にprivateを記述するのは、C++言語においての役割は全く同じです。

 一方、「自分(親クラス)と息子(子クラス)たちは見てもいいけれど、他の人には決して見せたくない!」変数・関数を宣言するキーワードもC++には用意されています。それはprotected制御子と呼ばれています。

protected.cpp
class CEnemy
{
private:
	int hardness;	//耐久性
	int score;		//得点
protected:
	void SetScore(int val);
public:
	CEnemy();		//コンストラクタ
	void SetHardness(int val);
};

 例えば、このようにSetScore()関数をprotectedタイプにしてしまうと、子クラスであるCEnemy2内では普通に使用できる一方、main関数やCEnemyと親子関係にないクラスの関数からは、SetScore()関数を利用することができなくなります。

protectedclass.cpp
class CEnemy2 : protected CEnemy
{
private:
	int x, y;		//現在の位置
public:
	CEnemy2();
	void Move();
};

 protectedは、上記のように用いることもできます。このとき、親クラスのpublic定義の変数・関数は、子クラスではprotectedとみなされます。やはり親クラスのprivateへは、子クラスからアクセスはできません。