1. 单一继承
(1)实验代码
#include <iostream> #include <string> using namespace std; void visitVtbl(int **vtbl) { cout << vtbl << endl; cout << "\t[-1]: " << (long)vtbl[-1] << endl; typedef void (*FuncPtr)(); int i=0; while(vtbl[i]!=0) { cout << "\t[" << i << "]: " << vtbl[i] << " -> "; FuncPtr func = (FuncPtr)vtbl[i]; func(); ++i; } } class Base { public: Base() { mBase1 = 101; mBase2 = 102; } virtual void func1() { cout << "Base::func1()" << endl; } virtual void func2() { cout << "Base::func2()" << endl; } private: int mBase1; int mBase2; }; class Derived : public Base { public: Derived(): Base() { mDerived1 = 1001; mDerived2 = 1002; } virtual void func2() { cout << "Derived::func2()" << endl; } virtual void func3() { cout << "Derived::func3()" << endl; } private: int mDerived1; int mDerived2; }; int main() { Derived d; char *p = (char*)&d; visitVtbl((int**)*(int**)p); p += sizeof(int**); cout << *(int*)p << endl; p += sizeof(int); cout << *(int*)p << endl; p += sizeof(int); cout << *(int*)p << endl; p += sizeof(int); cout << *(int*)p << endl; return 0; } /*输出结果 0x404338 [-1]: 4211452 [0]: 0x402998 -> Base::func1() [1]: 0x402a20 -> Derived::func2() [2]: 0x402a50 -> Derived::func3() 101 102 1001 1002 */