From: Brian L. <bll...@ea...> - 2005-08-25 05:26:27
|
On Wed, 2005-08-24 at 21:29 -0700, Daniel Horn wrote: > for the record > dynamic_cast only throws a std::bad_cast if you've tried to cast a > reference... Now, can anyone tell me why we do not use dynamic_cast, since we are using pointers and not references? It seems to be the correct item right now. If we are downcasting, I see no reason to put a cast at all, and that is the only thing that I've seen being done, after reviewing the code. I didn't mean to get such a shouting match started over this. Here is the last code from me on this. It compiles just find under g++. #include <string> #include <iostream> class a { public: a() {}; virtual ~a() {}; }; class b: public a { public: b() {}; virtual ~b() {}; }; class c { public: c() {}; virtual ~c() {}; }; int main(int, char**) { a o1; b o2; a& or1 = o1; a& or2 = o2; a* op1 = &o1; a* op2 = &o2; try { std::cout << "TEST 1 dynamic_casting from a* to c* "; c* t1 = dynamic_cast<c*>(op2); if (t1==NULL) std::cout << "NULL RETURNED\n"; else std::cout << "We are goint to crash later\n"; } catch (...) { std::cout << "EXEPTION THROWN\n"; } void *t2=NULL; try { std::cout << "TEST 2 dynamic_casting from a* to void* "; t2 = dynamic_cast<void*>(op2); if (t2==NULL) std::cout << "NULL RETURNED\n"; else std::cout << "We are goint to crash later if not careful\n"; } catch (...) { std::cout << "EXEPTION THROWN\n"; } #if 0 // won't compile try { std::cout << "TEST 3 dynamic_casting from void* to a* "; a* t3 = dynamic_cast<void*>(t2); if (t3==NULL) std::cout << "NULL RETURNED\n"; else std::cout << "We are goint to crash later if not careful\n"; } catch (...) { std::cout << "EXEPTION THROWN\n"; } try { std::cout << "TEST 4 dynamic_casting from void* (a*) to c* "; c* t4 = dynamic_cast<void*>(t2); if (t1==NULL) std::cout << "NULL RETURNED\n"; else std::cout << "We are goint to crash later\n"; } catch (...) { std::cout << "EXEPTION THROWN\n"; } #endif try { std::cout << "TEST 5 dynamic_casting from a& to c& "; c& t5 = dynamic_cast<c&>(or1); std::cout << "We are goint to crash soon\n"; } catch (...) { std::cout << "EXEPTION THROWN\n"; } return 0; } Now, back to trying to figure out OGRE and if it will be useful... |