Connex: [[C++]] [[C]] ===CASTS=== class Child : public Mother { virtual someThing() {} //if not virtual : cannot dynamic_cast ... (source type is not polymorphic) } Mother* pn = new Child; Child* pb = dynamic_cast(pn); ===TYPED FUNCTIONS & RTTI=== #include using namespace std; #define debug(x) cerr<<"# " <<(x)<(pm) ) { f(pd); } // D : ok debug("test types one after one... "); if ( S* ps = dynamic_cast(pm) ) { f(ps); } // nothing debug("- main"); return 0; } While it is not possible in [[C]] : struct M { char* name_; }; struct D { struct M* super_; }; void f(struct M* m) { debug("-f M*"); } //void f(struct D* m) { debug("-f D*"); } //mainc.c:14: error: conflicting types for `f' //mainc.c:13: error: previous declaration of `f'