C++でインターフェースを定義する

      2018/06/14

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のデストラクタを純粋仮想関数で定義し、その中身を記述することも可能ですが、インターフェース風に扱うなら不要だと思います。

 - C言語/C++