#include #include #include #include using namespace std; class A { public: virtual void f(); virtual ~A() {} ;}; void A::f() { } class B { public: virtual void g(); }; void B::g() { } class AB : public virtual A, public B { public: virtual ~AB() {};}; int main( ) { AB ab; B b; //B* bp = (B*)&ab; // C-style cast needed to break protection B* bp = dynamic_cast(&ab); A* ap = dynamic_cast(bp); // fails, B is inaccessible //assert(ap == NULL); try { AB& abr = dynamic_cast(b); // fails, B is inaccessible } catch(const bad_cast&) { cout << "bad_cast caught at line " << __LINE__ << endl; return -1; // failed reference cast caught here } cout << "should not get here" << endl; return 0; }