' P '

whatever I will forget

C++ Polymorphism Virtual function and destructor

さて、誰も見ていないが前回の問題を解決するコードは下記だ!!

#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をつけたほうがいいっぽいです。