派生クラスの例外を基底クラスの参照でキャッチできない件について(VC6 SP6)
VC6 SP6において、派生クラスの例外をスローしているのに、基底クラスでキャッチできない現象が発生した。
以下、再現ソース。
class base { protected : virtual ~base(){} // 基底クラスのデストラクタをprotectedにすると、 // 基底クラスで例外をキャッチできない。 //public : virtual ~base(){} // パブリックならOK } ; class derived : public base { public : ~derived(){} } ; void func() { throw derived() ; } int main(int argc, char* argv[]) { try { func() ; } catch( base &e ) { cout << "catch base。こっちだよねぇ。" << endl ; } catch( derived &e ) { cout << "catch derived。なぜ?" << endl ; } getchar() ; return 0; }
ソース中にも記述されているけど、デストラクタをpublicにすれば基底クラスの参照でキャッチ出来る。VC8で同じようなコードを実行した所、どちらも基底クラスの参照でキャッチされてるので、VC6 SP6のバグなんだろう・・・
VC6捨てたいよぅ。