派生クラスのポインタで例外をキャッチできない。
#include <stdio.h> #include <stdlib.h> class A { public: virtual ~A() { } virtual const char *get_name() { return "A"; } }; class B :public A { public: virtual const char *get_name() { return "B"; } }; int main(int argc, char *args[]) { argc, args; // 警告避け A *obj = new B; try { throw obj; } catch(B *e) { puts("catch(B*)"); puts(e->get_name()); } catch(A *e) { puts("catch(A*)"); puts(e->get_name()); } catch(...) { puts("catch(...)"); } delete obj; return EXIT_SUCCESS; }
...を実行すると、その結果は...
catch(A*) B
...となる。bcc, vc, icc, g++, mwcc, dmc, wc で試してみたけどいずれも変わらず。
throw したのは飽くまで A のポインタだし、極当り前の挙動で、規格的にもこの挙動で問題ないみたいなんだけど、規格的には不完全型やそのポインタや参照は throw できないことになってたりする(15.1.3)ことから、ひょっとして上のようなコードを実行したら、B*でキャッチできて...
catch(B*) B
...のような結果が得られたりするのか?と期待したんだけど残念。ちょっといま考えてるエラーハンドリングの仕組みで遅延throwをやろうと考えてて、この後者のような挙動になってくれてるととても嬉しかったんだが。