今回は仮想関数について質問させてください。
まず下記のコードをご確認ください。
クラスBASEを継承した、クラスA、Bがあります。
class BASE{ public: int x,y,z; virtual void Calc(){ z=x+y; } }; class A : public BASE{ int x,y,z; public: void Calc(){ z=x-y; } }; class B : public BASE{ int x,y,z; public: void Calc(){ z=x*y; } };そこで質問があります。
質問①
基底クラスのCalc関数を仮想関数にしていますが、その派生クラスである、A、Bのクラスでは
Calc関数をオーバーライドしています。
このように派生クラス側でオーバーライドする場合、BASEクラスを継承し、Calc関数を仮想関数化する意味
はあるのでしょうか?
自分の考えでは、基底クラスのポインタを使って、各派生クラスのインスタンスを作成し、
そのポインタを使って、それぞれのクラスのCalc関数が呼ばれるようにするぐらいしかメリットはないですよね?
つまり、各派生クラスでA a,B bのようにそれぞれでインスタンスを作ってしまえば、
仮想関数にする意味はないのではないかと思っているんです。
質問②
インターフェースクラスについて。
BASEクラスを継承したクラスA、Bのインスタンスでしか、Calc関数は呼び出さないとします。
つまり、BASE baseみたいに基底クラス単体でインスタンス作って、その関数を呼び出さないってことです。
その場合、基底クラスの仮想関数をvirtual void Calc() = 0として、純粋仮想関数化し、
インターフェースクラスにするべきなのでしょうか?
質問③
インターフェースクラスにした場合、「インタフェースクラスには仮想デストラクタを宣言しておくべき」と
このhttp://www.geocities.jp/ky_webid/cpp/language/010.htmlの下のほうに
書いてありますが、この理由を教えてください。
また、そのインターフェースクラスを継承した派生クラスにも仮想デストラクタを宣言する必要があるのか、
教えてください。
質問④
基底クラスの関数にvirtualをつけて、仮想関数化した場合、その派生クラスには該当の関数にvirtualを
つける必要はありますでしょうか?
いらないと思ったんですが、このhttp://marupeke296.com/GDEV_No7_StateImpliment2.htmlに、派生クラス側にもvirtualをつけてるものがあったものでして^^;
大体以上です。分かりにくくて申し訳ありませんが、よろしくお願い致します。