「純粋仮想関数」について勉強しました
これまでに「仮想関数」について学んできましたが、今回は「純粋仮想関数」について学んでいきたいと思います。
「抽象」という概念が元になっているとのことで、全然意味がわからないので結構心配です・・・
「新しいことを学ぶ」というのは毎回ドキドキですが、わかると「楽しい」という気持ちも沸いてきます。
「わからない」とずっとモヤモヤしていますが・・・
「純粋仮想関数」の仕組み
今回、メインになる考え方は「抽象」という考え方とのことで、簡単に言うと「あいまい(曖昧)」なものという意味らしいです。
自分は普段使わない言葉なのですが、「モヤっとしている」というイメージなのかなと思います。
クラスの中に「純粋仮想関数」が存在していると、そのクラスは「抽象クラス」になるそうです。
ではその「純粋仮想関数」を作るためにはどうするのかというと、
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++言語」の「多重継承」の仕組みを学んでみよう!