// VC98 cl -GX PolymorphicPtr.cpp // VC2005,2008,2010 // cl -EHsc PolymorphicPtr.cpp -FaPolymorphicPtr.asm -FAsc #include using namespace std; class Base { public: virtual void service(); }; void Base::service() { cout << "Base::service()\n"; } class Derived: public Base { public: virtual void service(); }; void Derived::service() { cout << "Derived::service()\n"; } void main() { Base *bptr; Derived dObj; Derived *dptr = &dObj; bptr = &dObj; Base &bref = dObj; //----------------- Static binding ------------------- dObj.service(); // lea ecx, DWORD PTR _dObj$[ebp] // call ?service@Derived@@UAEXXZ ; Derived::service (&dObj)->service(); // lea ecx, DWORD PTR _dObj$[ebp] // call ?service@Derived@@UAEXXZ ; Derived::service dObj.Base::service(); // lea ecx, DWORD PTR _dObj$[ebp] // call ?service@Base@@UAEXXZ ; Base::service bptr->Base::service(); // mov ecx, DWORD PTR _bptr$[ebp] // call ?service@Base@@UAEXXZ ; Base::service dptr->Base::service(); // mov ecx, DWORD PTR _dptr$[ebp] // call ?service@Base@@UAEXXZ ; Base::service bref.Base::service(); // mov ecx, DWORD PTR _bref$[ebp] // call ?service@Base@@UAEXXZ ; Base::service // bptr->Derived::service(); // compilation error dptr->Derived::service(); // bref.Derived::service(); // compilation error // mov ecx, DWORD PTR _dptr$[ebp] // call ?service@Derived@@UAEXXZ ; Derived::service //----------------- Dynamic binding ------------------- dptr->service(); // mov eax, DWORD PTR _dptr$[ebp] // mov edx, DWORD PTR [eax] // mov esi, esp // mov ecx, DWORD PTR _dptr$[ebp] // mov eax, DWORD PTR [edx] // call eax // cmp esi, esp // call __RTC_CheckEsp bptr->service(); (*bptr).service(); bref.service(); (&bref)->service(); }