純粋仮想関数、抽象クラス、インターフェース
本記事の前提条件は以下の通りです。
- 初心者向け
- とは言っても、何らかのプログラムはそれなりに書けるけど、C とか C++ はちょっと、という人向け
- ざっくり概要しか説明しないので細かいことは気にしないでいただきたい
- Visual Studio 2013 くらい~
- Windowsプログラム (CUI, GUI)
- コードの検証
- 開発環境: Visual Studio 2022, x64, Release ビルド
- 実行環境: Windows 10
- 本記事は上から順番に読む前提となっている
- 「Visual Studio 2013 くらい~」と書いてあるが、本記事の内容だと現在過去未来のどのバージョンでもほぼ同じ
- 「Windowsプログラム (CUI, GUI)」と書いてあるが、本記事の内容だとどの OS でもほぼ同じ
前提知識として必要と思われる情報
純粋仮想関数
以下のようにすると、実装のない仮想関数を宣言することが出来る。
これを、純粋仮想関数という。
class Cook
{
public:
virtual void Wash() = 0;
};
抽象クラス
純粋仮想関数を1つでも持っているクラスを抽象クラスという。
抽象クラスをインスタンス化することはできない。
仮想関数は派生クラスでオーバーライドされたものを呼び出す。したがって、純粋仮想関数をオーバーライドした派生クラスを用意すれば、抽象クラスである基底クラスにキャストした状態でも呼び出すことが出来る、ということになる。
純粋仮想関数の実装
そもそも仮想関数は、インスタンス化された派生クラスで継承された関数を呼び出すためのものであるが、それとは別にその抽象クラス自体の関数として実装することもできる。
class Base
{
public:
virtual ~Base() = 0;
};
// inline 関数として、あるいはソースファイルで実装
Base::~Base(){}
これは専らデストラクタを念頭においたものであると思われる。デストラクタを純粋仮想関数とした場合でも、基底クラスにはデストラクタの実装が必要なためである。
なお、純粋仮想関数を実装した場合でも、仮想関数として呼び出すことができるわけではないので、依然として抽象クラスであり、インスタンス化することはできない。
インターフェース
パブリックな純粋仮想関数のみのクラスを「インターフェース」という。
class Cook
{
public:
virtual void Wash() = 0;
virtual void Cut() = 0;
virtual void Grill() = 0;
};
C++ には他言語にあるような interface
というものはないが、このインターフェースが同様の機能をもつものと考えてよい。
以上。