Cpp クラス 継承 デストラクタ 新しいページはコチラ
提供: yonewiki
(→クラス 継承 デストラクタ) |
(→クラス 継承 デストラクタ) |
||
68行: | 68行: | ||
Destructor:~CBaseInheritance() | Destructor:~CBaseInheritance() | ||
</syntaxhighlight2> | </syntaxhighlight2> | ||
+ | |||
+ | それで、メイン関数で形態を変える都度、消滅する処理をいれると、以下のようになります。 | ||
+ | |||
+ | <span style="color: #ffffff; background-color: #555555; padding: 0px 5px 0px 5px; display: inline-block;">cpp <span>(</span>メイン関数 InheritanceMain.cpp<span>)</span><!-- padding 上 右 下 左--> | ||
+ | <syntaxhighlight2 lang="cpp" line> | ||
+ | #include "pch.h" | ||
+ | #include "BaseInheritance.h" | ||
+ | #include "DeriveInheritance.h" | ||
+ | #include "DeriveArrInheritance.h" | ||
+ | #include "DeriveDiscountInheritance.h" | ||
+ | |||
+ | CBaseInheritance* pCBaseInheritanceUpcastF(int iSelectDerive) { | ||
+ | int piOptionUpcastArr[] = { 800, 200, 500, 220 }; | ||
+ | int iSize = (int)(sizeof piOptionUpcastArr / sizeof(*piOptionUpcastArr)); | ||
+ | switch (iSelectDerive) { | ||
+ | case 1: | ||
+ | return new CDeriveInheritance(2900, 12); | ||
+ | case 2: | ||
+ | return new CDeriveArrInheritance(2900, 12, piOptionUpcastArr, iSize); | ||
+ | default: | ||
+ | return new CDeriveDiscountInheritance(3900, 12, 0.5); | ||
+ | } | ||
+ | }; | ||
+ | |||
+ | int main() { | ||
+ | |||
+ | CBaseInheritance* pCBaseInheritanceUpcast; | ||
+ | pCBaseInheritanceUpcast = pCBaseInheritanceUpcastF(1); | ||
+ | pCBaseInheritanceUpcast->mf_vBaseDispValue(); | ||
+ | delete pCBaseInheritanceUpcast; | ||
+ | |||
+ | pCBaseInheritanceUpcast = pCBaseInheritanceUpcastF(2); | ||
+ | pCBaseInheritanceUpcast->mf_vBaseDispValue(); | ||
+ | delete pCBaseInheritanceUpcast; | ||
+ | |||
+ | pCBaseInheritanceUpcast = pCBaseInheritanceUpcastF(3); | ||
+ | pCBaseInheritanceUpcast->mf_vBaseDispValue(); | ||
+ | delete pCBaseInheritanceUpcast; | ||
+ | |||
+ | return 0; | ||
+ | |||
+ | } | ||
+ | </syntaxhighlight2> | ||
+ | |||
+ | これなら、なんとなく思い描いたとおりの動作になります。 | ||
+ | |||
+ | <span style="color: #ffffff; background-color: #555555; padding: 0px 5px 0px 5px; display: inline-block;">実行結果<!-- padding 上 右 下 左--> | ||
+ | <syntaxhighlight2 lang="text" line start=100> | ||
+ | Constructor:CBaseInheritance(int,int) | ||
+ | Constructor:CDriveInheritance(int,int) | ||
+ | BaseMoney=34800 | ||
+ | Destructer:~CDeriveInheritance() | ||
+ | Destructor:~CBaseInheritance() | ||
+ | Constructor:CBaseInheritance(int,int) | ||
+ | Constructer:CDeriveArrInheritance(int,int,int*,int) | ||
+ | BaseMoney=34800 | ||
+ | Destructer:~CDeriveArrInheritance() | ||
+ | Destructor:~CBaseInheritance() | ||
+ | Constructor:CBaseInheritance(int,int) | ||
+ | Constructer:CDeriveDiscountInheritance(int,int,double) | ||
+ | BaseMoney=46800 | ||
+ | Destructer:~CDeriveDiscountInheritance() | ||
+ | Destructor:~CBaseInheritance() | ||
+ | </syntaxhighlight2> | ||
+ | |||
+ | という感じで、きちんとそれぞれの派生クラスのデストラクタが動くようになります。よくクラスのデストラクタにはvirtualを付けとけ、というようなことを言う、なんでもvirtual ~xxxデストラクタ主義を唱える人がいますが、自分はアップキャストで使うクラスだけに付ければよいと思います。そんなアップキャストするかどうかも意識していない基底クラスを利用すれば、デストラクタがどこではたくかを意識していないということになるので、雑なプログラムになってしまいます。ちゃんと管理した方が良いと思います。設計図でしっかりと管理してほしいな。なんでもvirtualでもいいですけど。不要なデストラクタが省略できなくなるよ。 | ||
+ | |||
+ | それってわかりにくくないかな。 | ||
+ | |||
+ | 好きなようにしてもらえればいいですけど。 | ||
[[C PlusPlus#C++からの技術|C++]]に戻る | [[C PlusPlus#C++からの技術|C++]]に戻る |