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
仮想関数、純粋仮想関数など馴染みの無い名称だととっつきにくいが、内容は理解しました。