Cpp クラス 継承 デストラクタ 新しいページはコチラ
提供: yonewiki
(→クラス 継承 デストラクタ) |
(→クラス 継承 デストラクタ) |
||
17行: | 17行: | ||
+ | じゃぁもう説明すること無いんじゃね? | ||
+ | |||
+ | |||
+ | と、継承の記事からやってきた人は思うかもしれない、でも、継承 アップキャストの記事から来た人は最後に提示された問題の解決をしなければならないことを知っているかもしれません。詳しくは[[Cpp クラス 継承 アップキャスト]]を参照して下さい。アップキャストのような使い方をすると、基底のクラスが動的に生成されつつも、アップキャストで基底クラスが利用するクラスを決定するようなプログラムで派生クラスでも動的に生成する変数やクラスがあった場合、派生クラスで、デストラクタを準備したとしても、基底クラスが消滅した場合には派生クラスのデストラクタは呼ばれません。基底クラスのデストラクタが派生クラスのデストラクトがあることを知らないからです。派生クラスのデストラクタがあると知らせるにはデストラクタを仮想関数にする必要があります。オーバライドされてると教え込むことで、派生クラスのデストラクタが動きます。 | ||
+ | |||
+ | |||
+ | [[Cpp クラス 継承 アップキャスト]]で示したサンプルプログラムの基底クラスを以下のようにします。 | ||
+ | |||
+ | <span style="color: #ffffff; background-color: #555555; padding: 0px 5px 0px 5px; display: inline-block;">cpp <span>(</span>基底クラス BaseInheritance.h<span>)</span><!-- padding 上 右 下 左--> | ||
+ | <syntaxhighlight2 lang="cpp" line> | ||
+ | #ifndef __BASEINHERITANCE_H_YONET__ | ||
+ | #define __BASEINHERITANCE_H_YONET__ | ||
+ | #if _MSC_VER > 1000 | ||
+ | #pragma once | ||
+ | #endif | ||
+ | |||
+ | class CBaseInheritance { | ||
+ | protected: | ||
+ | int m_iBaseMoney = 0; | ||
+ | int m_iBaseMonth = 0; | ||
+ | int m_iMoney = 0; | ||
+ | int mf_iBaseSumMoney(); | ||
+ | public: | ||
+ | CBaseInheritance(); | ||
+ | CBaseInheritance(int iArgBaseMoney, int iArgBaseMonth); | ||
+ | virtual ~CBaseInheritance(); | ||
+ | void mf_vDispValue(); | ||
+ | void mf_vBaseDispValue(); | ||
+ | }; | ||
+ | #endif | ||
+ | </syntaxhighlight2> | ||
+ | |||
+ | これだけで、基底クラスが消滅したときにアップキャストされた基底クラスが派生クラスのデストラクタを保持することになります。つまり派生クラスのデストラクタが動く可能性が出てきました。しかし、今回作ったメイン関数では、ポリモーフィズムで形態を変えるごとに基底クラスが消滅しないため、1回目の派生クラスからのアップキャスト生成と2回目のアップキャスト生成に対しては消滅処理がされないため、派生クラスのデストラクタは呼ばれません。基底クラスのデストラクタも呼ばれません。 | ||
+ | |||
+ | |||
+ | ですから、上記変更だけを適用した状態では、動作結果は以下のようになります。 | ||
+ | |||
+ | <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 | ||
+ | Constructor:CBaseInheritance(int,int) | ||
+ | Constructer:CDeriveArrInheritance(int,int,int*,int) | ||
+ | BaseMoney=34800 | ||
+ | Constructor:CBaseInheritance(int,int) | ||
+ | Constructer:CDeriveDiscountInheritance(int,int,double) | ||
+ | BaseMoney=46800 | ||
+ | Destructer:~CDeriveDiscountInheritance() | ||
+ | Destructor:~CBaseInheritance() | ||
+ | </syntaxhighlight2> | ||
[[C PlusPlus#C++からの技術|C++]]に戻る | [[C PlusPlus#C++からの技術|C++]]に戻る |