C++でインターフェースを定義する
C++ にインターフェースは存在しません。
作成したい場合は抽象クラスで表現します。以下に実装のサンプルを記載します。
インターフェース定義
class IAnimal {
public:
virtual ~IAnimal() {};
virtual void printName(void) = 0;
};
全て仮想関数にし、各関数の末尾に= 0
を追加します(pure-specifier構文)。これを純粋仮想関数と言います。
純粋仮想関数を含むクラスはインスタンス化できないので、継承して使用されることになり、結果、インターフェースのように扱えます。
純粋仮想関数を含むクラスを抽象クラスといいます。
抽象クラスはオブジェクトの作成はできませんが、ポインタ型で参照は行えるため、派生クラスを知らなくてもアクセスできます。
実装クラス
インターフェース実装クラス定義
class 派生クラス名 : 継承修飾子 抽象クラス
継承修飾子は
public
にしないと、抽象クラスのポインタへ変換できないので注意。サンプル
class Dog : public IAnimal {
public:
Dog();
~Dog();
void printName(void);
};
void Dog::printName(void) {
printf("Dog\n");
}
使用例
IAnimal * animal = new Dog;
animal->printName();
delete animal;
IAnimal
にデストラクタがないと、上記でdelete animal
をしてもDogクラス
のデストラクタがコールされません。
生成クラスを意識しないようにしたい場合は、必ずデストラクタを定義しておきましょう。
ちなみにIAnimal
のデストラクタを純粋仮想関数で定義し、その中身を記述することも可能ですが、インターフェース風に扱うなら不要だと思います。