#include template const char* tn( C ) { return "unknown"; } template <> const char* tn( int ) { return "int"; } template <> const char* tn( long ) { return "long"; } template class a { public: virtual void f( C n ) { std::cout << "a<" << tn( n ) << ">::f(" << tn( n ) << ")" << std::endl; } a* getA( C ) { return this; } }; template class b : virtual public a { public: virtual void f( C n ) { a::f( n ); std::cout << "b<" << tn( n ) << ">::(" << tn( n )<< ")" << std::endl; } }; class c : public b, public b { public: virtual void f( int n ) { return f_impl( n ); } virtual void f( long n ) { return f_impl( n ); } template void f_impl( D n ) { b::f( n ); std::cout << "c::f(" << tn( n ) << ")" << std::endl; } using a::getA; using a::getA; /* virtual a* getA( int n ) { return b::getA( n ); } virtual a* getA( long n ) { return b::getA( n ); } */ }; class d : public c { public: virtual void f( int n ) { return f_impl( n ); } virtual void f( long n ) { return f_impl( n ); } template void f_impl( D n ) { c::f( n ); std::cout << "d::f(" << tn( n )<< ")" << std::endl; } }; void test_cast( c* p ) { b* bi = p; b* bl = p; a* ai = p; a* al = p; a* bai = bi; a* bal = bl; a* gai = p->getA( int(0) ); a* gal = p->getA( long(0) ); a* dai = dynamic_cast*>(p); a* dal = dynamic_cast*>(p); b* dbi = dynamic_cast*>(p); b* dbl = dynamic_cast*>(p); a* sai = static_cast*>(p); a* sal = static_cast*>(p); b* sbi = static_cast*>(p); b* sbl = static_cast*>(p); p->f( long(0) ); std::cout << "=================>calling p->f( long )" << std::endl; al->f( long(0) ); std::cout << "=================>calling al->f( long )" << std::endl; std::cout << "dai=" << dai << " dal=" << dal << std::endl; std::cout << "sai=" << sai << " sal=" << sal << std::endl; std::cout << "bai=" << bai << " bal=" << bal << std::endl; std::cout << "gai=" << gai << " gal=" << gal << std::endl; std::cout << " ai=" << ai << " al=" << al << std::endl; std::cout << "dbi=" << dbi << " dbl=" << dbl << std::endl; std::cout << "sbi=" << sbi << " sbl=" << sbl << std::endl; std::cout << " bi=" << bi << " bl=" << bl << std::endl; std::cout << " p=" << p << std::endl; } int main ( void ) { d d_o; c c_o; test_cast( &c_o ); std::cout << "&c_o=" << &c_o << std::endl; std::cout << std::endl << "------------------------------------------" << std::endl; test_cast( &d_o ); std::cout << "&d_o=" << &d_o << std::endl; return 0; }