C++ クラス -オーバーライド- [開発環境]
参考サイト
◆オーバーライド
継承によって作られたサブクラスは、スーパークラスのメンバを引き継ぎますが、オーバーライドを使うと、 引き継いだメンバ関数の中身を書き換えることができます。つまり、スーパークラス側とサブクラス側とで、異なる 動作をさせることができるようになるということです。
コーディング例
// pen.h
// CColorPenクラスで使う線の色
#define BLACK (0)
#define RED (1)
#define BLUE (2)
#define GREEN (3)
// 黒いペンのクラス
class CPen
{
public:
// 線を描く
virtual void DrawLine(int sx, int sy, int ex, int ey);
};
// 色ペンのクラス
class CColorPen : public CPen
{
public:
// 線を描く
void DrawLine(int sx, int sy, int ex, int ey);
// 線の色を設定する
void SetColor(int color);
private:
// 線の色
int m_color;
};// pen.cpp
#include "pen.h"
// 黒い線を描く
void CPen::DrawLine(int sx, int sy, int ex, int ey)
{
// 黒い線を描く
}
// 現在設定されている色で線を描く
void CColorPen::DrawLine(int sx, int sy, int ex, int ey)
{
// m_colorを参照して、その色で線を描く
}
// 線の色を設定する
void CColorPen::SetColor(int color)
{
m_color = color;
}
オーバーライドを行うためには、スーパークラス側のメンバ関数に「virtual」 というキーワードを付けます。virtualを付けて宣言されたメンバ関数のことを、仮想関数 と呼びます。
そして、メンバ関数の定義ですが、スーパークラス側もサブクラス側も、両方とも定義を記述します。そのため、 両者の内容を変えれば、動作を変更できるわけです。CPenクラス側のDrawLineメンバ関数を呼び出すと、黒い線が描かれ、 CColorPenクラス側のDrawLineメンバ関数を呼び出すと、現在の色で線が描かれるようにします。
main関数の方は、次のようにしたとします。
// main.cpp
#include "pen.h"
int main()
{
CPen pen;
CColorPen color_pen;
pen.DrawLine( 10, 10, 100, 100 ); // 黒い線を描く
color_pen.SetColor( RED ); // 赤色を設定
color_pen.DrawLine( 20, 20, 200, 200 ); // 赤い線を描く
return 0;
}
コメント 0