1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
| #include <iostream> #include <cstdlib> using namespace std; class BaseClass { public: BaseClass() { cout<<"BaseClass Construct"<<endl; } virtual ~BaseClass() { cout<<"BaseClass Destruct"<<endl; } virtual void TestFunction() { cout<<"BaseClass TestFunction"<<endl; } protected: int Test; }; class SonClass : public BaseClass { public: SonClass() { cout<<"SonClass Construct"<<endl; } virtual ~SonClass() { cout<<"SonClass Destruct"<<endl; } virtual void TestFunction() { cout<<"SonClass TestFunction"<<endl; } }; typedef void *LPVOID; template<class _baseClass, class _derivedClass> bool DoDynamicSubclassing(_baseClass *pBaseObj) { if(pBaseObj) { static_assert(sizeof(_baseClass) == sizeof(_derivedClass), "DynamicSubclassing to _derivedClass must not have its own members"); _derivedClass _derivedClassinstance; LPVOID *pBaseVirtPtr = (LPVOID*)pBaseObj, *pDerivedVirtPtr = (LPVOID*)&_derivedClassinstance; *pBaseVirtPtr = *pDerivedVirtPtr; return true; } return false; } int main() { BaseClass *Test = new BaseClass; cout << *(int*)Test << endl; DoDynamicSubclassing<BaseClass, SonClass>(Test); Test->TestFunction(); cout << *(int*)Test << endl; cout << " ————————- " <<endl; BaseClass aaaa; cout << *(int*)&aaaa << endl; DoDynamicSubclassing<BaseClass, SonClass>(&aaaa); aaaa.TestFunction(); cout << *(int*)&aaaa << endl; return 0; }
|