C++はクラスを継承する際に、デストラクタにvirtual修飾子を付けることが推奨されている。
e.g.
virtual ~Ambulance();
virtual修飾子は仮想関数として機能する。virtualが付いたメンバ関数の場合、子クラスでオーバーライドされた同名のメンバ関数が実行される。
#ifndef _BIRD_H_ #define _BIRD_H_ #include <iostream> #include <string> using namespace std; class Bird { public: virtual void sing(); void fly(); }; #endif
#include "bird.h" void Bird::sing(){ cout << "鳥が鳴く" << endl; } void Bird::fly(){ cout << "鳥が飛ぶ" << endl; }
継承した仮想関数
#ifndef _CROW_H_ #define _CROW_H_ #include "bird.h" class Crow : public Bird { public: void sing(); void fly(); }; #endif
#include "crow.h" void Crow::sing(){ cout << "カーカー" << endl; } void Bird::fly(){ cout << "カラスが飛ぶ" << endl; }
親クラスで定義するんだね。
親クラスで使わない場合は、=0として、純粋仮想関数とすることもできる。
#ifndef _BIRD_H_ #define _BIRD_H_ #include <iostream> #include <string> using namespace std; class Bird { public: virtual void sing() = 0; void fly(); }; #endif
仮想関数、純粋仮想関数など馴染みの無い名称だととっつきにくいが、内容は理解しました。