「純粋仮想関数」について勉強しました

これまでに「仮想関数」について学んできましたが、今回は「純粋仮想関数」について学んでいきたいと思います。

「抽象」という概念が元になっているとのことで、全然意味がわからないので結構心配です・・・

「新しいことを学ぶ」というのは毎回ドキドキですが、わかると「楽しい」という気持ちも沸いてきます。

「わからない」とずっとモヤモヤしていますが・・・

「純粋仮想関数」の仕組み

今回、メインになる考え方は「抽象」という考え方とのことで、簡単に言うと「あいまい(曖昧)」なものという意味らしいです。

自分は普段使わない言葉なのですが、「モヤっとしている」というイメージなのかなと思います。

クラスの中に「純粋仮想関数」が存在していると、そのクラスは「抽象クラス」になるそうです。

ではその「純粋仮想関数」を作るためにはどうするのかというと、

virtual void sample() = 0;

のように「virtual」を付けて、「= 0」を代入すると、「純粋仮想関数」を作ることができます。

この関数は「実装を書かなくてもいい」関数なのですが、この関数があることによって「抽象クラス」となり、この「抽象クラスのオブジェクトは作れない」とのことです。

では、本当に「純粋仮想関数」があるとオブジェクトが作れないのか試してみたいと思います。

「ヘッダーファイル」は、

#ifndef ___CLASS_Sample
#define ___CLASS_Sample

#include "Sample.h"

class Sample {
public:
    virtual void test() = 0;
};

#endif

のように作成し、「実装ファイル」は、

#ifndef ___CLASS_Sample
#define ___CLASS_Sample

#include "Sample.h"

class Sample {
public:
    virtual void test() = 0;
};

#endif

「main」関数は、

#include <iostream>
#include "Sample.h"

using namespace std;

int main() {

    Sample samp;

    return 0;
}

に作成し、「Sample」クラスのオブジェクトを作ってみると、

error: cannot declare variable 'samp' to be of abstract type 'Sample'

のようにコンパイル時にエラーが発生します。

「samp」変数は「抽象型」なので、「samp」の変数は定義できません的なことが書かれている(はず)んだと・・・

確かに「純粋仮想関数」を持つクラスのオブジェクトは作れないことがわかりました。

では、どうやってオブジェクトを作ったらいいんだ???

と思って調べてみると、「継承した先のクラスで純粋仮想関数の内容を定義しなさい」とありました。なるほど・・・

いろいろと学ぶことが多くて混乱してきました(^^;)

「純粋仮想関数」となっていた「Sample」クラスの「test」メソッドを、

#include <iostream>
#include "Sample.h"

using namespace std;

class SampleChild : public Sample { // @suppress("仮想メソッドと非仮想デストラクターがあるクラス")
public:
    void test() const {
        cout << "testChild" << endl;
    }
};

int main() {

    SampleChild *sampChild = new SampleChild();

    sampChild->test();

    return 0;
}

のように内容を定義すると、オブジェクトを作ることができるようになりました。

「抽象」という考え方に慣れるまでしばらくかかりそうですが、「どんな仕組みなのか?」はわかった気がします。

忘れないようにちゃんと復習しよう。

→(前へ)「例外処理」と「const」の仕組みについて理解しよう!

→(次へ)「C++言語」の「多重継承」の仕組みを学んでみよう!

「C++言語」学習書籍

HOMEへ