インタフェースは抽象クラスとも呼ばれている.
インタフェースは:
1. メンバ変数を持たず
2. メンバ関数だけで構成される (宣言だけ, 定義がない)
3. インタフェースクラスをインスタンス化することもできない
注意:
インタフェースクラスは, 継承して使うこと, そして, 定義のないメンバ関数たちは, オーバーライドで使用する.
C++ ではインタフェースクラスを実現する方法:
// インタフェースクラスの定義
class IPen{
public:
// 線を描く
virtual void DrawLine(int sx, int xy, int ex, int ey) = 0;
}
注意:
最後に [ = 0] が付いており, これを付けると, そのメンバ関数の定義を省略できる. 定義がないために, このクラスをインスタンス化することができない.
インタフェース (純粋仮想関数を含んでいるクラス) はインスタンス化ができない. そのため, 必ず継承を行い, そのサブクラス側の方をインスタンス化することになる.
pen.h
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | // pen.h
// CColorPen クラスで使う線の色
#define BLACK (0)
#define RED (1)
#define BLUE (2)
#define GREEN (3)
// インタフェースクラスの定義
class IPen{
public:
// 線を描く
virtual void DrawLine(int sx, int sy, int ex, int ey) = 0;
};
// 黒いペンのクラス (インタフェースクラスは IPen)
class CPen : public IPen{
public:
// 線を描く
void DrawLine(int sx, int sy, int ex, int ey);
};
// 色ペンのクラス (インタフェースクラスは IPen)
class CColorPen : public IPen{
private:
int m_color; // 線の色
public:
CColorPen(); // コンストラクタ
void DrawLine(int sx, int sy, int ex, int ey); // 線を描く
void SetColor(int color); // 線の色を設定する
};
|
pen.cpp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | // pen.cpp
#include "pen.h"
// 黒い線を描く
void CPen::DrawLine(int sx, int sy, int ex, int ey){
// 黒い線を描く
}
// CColorPen クラスのコンストラクタ
CColorPen::CColorPen(){
m_color = RED; // 赤いペンを初期カラーとする
}
// 現在設定されている色で線を描く
void CColorPen::DrawLine(int sx, int sy, int ex, int ey){
// m_color を参照して, その色で線を描く
}
// 線の色を設定する
void CColorPen::SetColor(int color){
m_color = color;
}
|
main.cpp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | // main.cpp
#include "pen.h"
int main(){
CPen pen;
CColorPen color_pen;
pen.DrawLine(10, 10, 100, 100); // 黒い線を描く
color_pen.SetColor(BLUE); // 青色を設定
color_pen.DrawLine(20, 20, 200, 200); // 青い線を描く
return 0;
}
|
GNUmakefile
.SUFFIXES: .o .cpp
.cpp.o:
$(CC) -c $(CFLAGS) $<
PROG = main
CC = g++
CFLAGS = -g -Wall
SRC = pen.cpp main.cpp
OBJ = pen.o main.o
hist: $(OBJ)
$(CC) $(CFLAGS) -o $(PROG) $(OBJ)
.PHONY: clean
clean:
$(RM) $(PROG) $(OBJ) *~ a.out
main.o: pen.h main.cpp
pen.o: pen.h pen.cpp
上記プログラムの実行結果は:
[wtopia interface]$ make
g++ -c -g -Wall pen.cpp
g++ -c -g -Wall main.cpp
g++ -g -Wall -o main pen.o main.o
注意:
IPen ipen; とすると, コンパイルが通らない.