さて、誰も見ていないが前回の問題を解決するコードは下記だ!!
#include <iostream> class Base { public: virtual void say_hello() const { std::cout << "this is Base class object" << std::endl; } virtual ~Base() {std::cout << "Base Destrcutor is called" << std::endl;} }; class Derived: public Base { public: virtual void say_hello() const { std::cout << "this is Derived class object" << std::endl; } virtual ~Derived() {std::cout << "Derived Destrcutor is called" << std::endl;} }; int main(){ Base *ptrb = new Base(); Base *ptrd = new Derived(); ptrb->say_hello(); ptrd->say_hello(); Base *array [] = {ptrb, ptrd}; for (auto i{0}; i<2; i++){ array[i]->say_hello(); } delete ptrb; delete ptrd; return 0; }
実行結果
this is Base class object this is Derived class object this is Base class object this is Derived class object Base Destrcutor is called Derived Destrcutor is called Base Destrcutor is called
要は、ベースクラスがあって、継承があって、virtual function 及び destructorがあれば、
ポリモーフィズムは成立する!!!!ということ!
なのでBaseクラスのポインタに継承クラスのオブジェクトを持たせちゃって、
そこから関数を呼び出せば、それぞれのクラスの関数を呼び出せる!って仕組みなんですね〜
すごいなー考えた人。
あとは、virtual
をつけないとそれぞれの関数のクラスを呼びにいってくれません。
(20分ほどなんでやって悩みましたw)
あと、destructorに関してもvirtualつけないとコンパイルwarningでるし、
warningのまま実行しちゃうとBaseクラスのpointerしかdeleteしてくれないので、
簡単にメモリリークを起こせます!
最後に、virtualはBaseクラスのみにつけたらいいっぽいですが、
視覚的にわかりやすいので面倒でもvirtualをつけたほうがいいっぽいです。