【VC++】デストラクタの中から,純粋仮想関数を呼び出すことは出来ない
関連記事
- 【#Assembler】結局x64のアセンブラでゴニョゴニョと書き始めたオイラはバカかっ!(爆 【2024年05月13日(月)】
- 【#VCPP #VisualStudio】VS2022のVC 64ビットコンパイルでインラインアセンブラが使えなくなってるぞー 【2024年05月10日(金)】
- 【#CPP】出先でC++にてライブラリの緊急実装!脳死したーキョムリすぎるー 【2024年01月15日(月)】
- 【C#】謎な改造アプリ,SIMD命令を導入して高速化しようか,思案中 【2023年11月14日(火)】
- 生成AI「仕事で利用」2割 正確性などに懸念(23/5/7) 【2023年05月07日(日)】
30分ほど,悩んだ.コンパイルが通らないっちゃもん
久しぶりにVCを引っ張りだして,C++な仕事?
スーパークラス(親)に純粋仮想関数を定義して(抽象クラスなりますな)
サブクラス(子)に実装して
この純粋仮想関数を『デストラクタ』の中から呼び出すと,コンパイルが通らない(汗
こんな感じ
//Oya.h class COya { public: COya(void); ~COya(void); virtual void Close() = 0; //純粋仮想関数で }; //Oya.cpp COya::COya(void) { } COya::~COya(void) { this->Close(); //<-- NGな呼び出し } //Kodomo.h class CKodomo : COya { public: CKodomo(void); ~CKodomo(void); void Close(); }; //Kodomo.cpp CKodomo::CKodomo(void) { } CKodomo::~CKodomo(void) { } void CKodomo::Close() //コヤツを複数のサブクラスで再定義したかったのじゃ { OutputDebugStringA( "func 通過" ); } [/cpp] C++のデストラクタ,"子供を破壊"した後,"親を壊す"順番に実行され デストラクタ内で,スーパークラス(親)内から,純粋仮想関数を呼びだそうとしても,すでに子供は破壊された後じゃから,そりゃ呼び出し先が判らなくなるわなぁ 当たり前って言えば当たり前 スーパークラスのデストラクタで,スレッドの後始末やらポート閉鎖確認やらやりたかったんじゃが ってことで,サブクラスのデストラクタから,スーパークラス内に定義した,後始末用のメソッドを呼び出すように変更してみたり こんな感じに変更してみた [cpp] //Oya.h class COya { protected: void Destroy(); //後始末用のメソッドをスーパークラスに追加 public: COya(void); ~COya(void); virtual void Close() = 0; }; //Oya.cpp COya::COya(void) { } COya::~COya(void) { } void COya::Destroy() { this->Close(); //後始末メソッドから,クローズ処理 } //Kodomo.h class CKodomo : COya { public: CKodomo(void); ~CKodomo(void); void Close(); }; //Kodomo.cpp CKodomo::CKodomo(void) { } CKodomo::~CKodomo(void) { Destroy(); //サブクラスのデストラクタから,後始末メソッドを呼び出し } void CKodomo::Close() { OutputDebugStringA( "func 通過" ); }まぁしかし,C#やらJAVAやら,”リソースは良きに計らえ”系に慣れきった体に,C++は辛いのぉ~
って,C++で慣れてしまったら,特にJAVAに戻った時「なんでデストラクタが無いんじゃ,グルぅぁ~~ 👿 」になりそうじゃけど(爆
すみません、ほんとにただの通りすがりです、
これって、、シンプルに、、継承したクラス側のデストラクタをvirtual にするだけかもですm
余計なお節介、、失礼いたいました、
>>通りすがりです、 さま
あ,あ,あ!
それかも!!デストラクタのvirtual臭い
この頃はまだデストラクタvirtualが”ほぼ”必須ってこと知らんかったし(大汗
いま,入院しているんで
退院後復調したら,このソースをVCに食わせてみまする