#include class Test { private: int i; public: virtual Test *GetThis() = 0; }; class Test2 : virtual public Test { public: Test2(); virtual Test2 *GetThis(); }; Test2::Test2() { std::cout << "Test2 as Test -> "; std::cout << (void*)static_cast ( this ) << std::endl; std::cout << "Test2 as Test2 -> "; std::cout << (void*)this << std::endl; } Test2 *Test2::GetThis() { return this; } int main ( int argc, char *argv[], char *envp[] ) { Test2 OBJ; Test2 *P2; Test * P; P2 = OBJ.GetThis(); std::cout << "From Test2::GetThis() -> "; std::cout << (void *)P2 << std::endl; P = &OBJ; P = P->GetThis(); std::cout << "From Test::GetThis() -> "; std::cout << (void *)P << std::endl; return 0; }