void visitVtbl(int **vtbl, int count)
{
    cout << vtbl << endl;
    cout << "\t[-1]: " << (long)vtbl[-1] << endl;
    typedef void (*FuncPtr)();
    for (int i = 0; vtbl[i] && i < count; ++i)
    {
        cout << "\t[" << i << "]: " << vtbl[i] << " -> ";
        FuncPtr func = (FuncPtr)vtbl[i];
        func();
    }
}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;
    int *p = (int*)&d;
    visitVtbl((int**)*(int**)p, 3);
    ++p; cout << *p << endl;
    ++p; cout << *p << endl;
    ++p; cout << *p << endl;
    ++p; cout << *p << endl;
    return 0;
}

class Base1
{
    public:
        Base1()
        {
            mBase1 = 101;
        }
        virtual void funcA()
        {
            cout << "Base1::funcA()" << endl;
        }
        virtual void funcB()
        {
            cout << "Base1::funcB()" << endl;
        }
    private:
        int mBase1;
};
class Base2
{
    public:
        Base2()
        {
            mBase2 = 102;
        }
        virtual void funcA()
        {
            cout << "Base2::funcA()" << endl;
        }
        virtual void funcC()
        {
            cout << "Base2::funcC()" << endl;
        }
    private:
        int mBase2;
};
class Derived : public Base1, public Base2
{
    public:
        Derived():
            Base1(),
            Base2()
        {
            mDerived = 1001;
        }
        virtual void funcD()
        {
            cout << "Derived::funcD()" << endl;
        }
        virtual void funcA()
        {
            cout << "Derived::funcA()" << endl;
        }
    private:
        int mDerived;
};int main()
{
    Derived d;
    int *p = (int*)&d;
    visitVtbl((int**)*(int**)p, 3);
    ++p; cout << *p << endl;
    ++p; visitVtbl((int**)*(int**)p, 3);
    ++p; cout << *p << endl;
    ++p; cout << *p << endl;
    return 0;
}

class Base
{
    public:
        Base()
        {
            mBase = 11;
        }
        virtual void funcA()
        {
            cout << "Base::funcA()" << endl;
        }
        virtual void funcX()
        {
            cout << "Base::funcX()" << endl;
        }
    protected:
        int mBase;
};
class Base1 : public Base
{
    public:
        Base1():
            Base()
        {
            mBase1 = 101;
        }
        virtual void funcA()
        {
            cout << "Base1::funcA()" << endl;
        }
        virtual void funcB()
        {
            cout << "Base1::funcB()" << endl;
        }
    private:
        int mBase1;
};
class Base2 : public Base
{
    public:
        Base2():
            Base()
        {
            mBase2 = 102;
        }
        virtual void funcA()
        {
            cout << "Base2::funcA()" << endl;
        }
        virtual void funcC()
        {
            cout << "Base2::funcC()" << endl;
        }
    private:
        int mBase2;
};
class Derived : public Base1, public Base2
{
    public:
        Derived():
            Base1(),
            Base2()
        {
            mDerived = 1001;
        }
        virtual void funcD()
        {
            cout << "Derived::funcD()" << endl;
        }
        virtual void funcA()
        {
            cout << "Derived::funcA()" << endl;
        }
    private:
        int mDerived;
};int main()
{
    Derived d;
    int *p = (int*)&d;
    visitVtbl((int**)*(int**)p, 4);
    ++p; cout << *p << endl;
    ++p; cout << *p << endl;
    ++p; visitVtbl((int**)*(int**)p, 3);
    ++p; cout << *p << endl;
    ++p; cout << *p << endl;
    ++p; cout << *p << endl;
    return 0;
}

class Base  { ...... }; 
class Base1 : virtual public Base  { ...... };int main()
{
    Base1 b1;
    int *p = (int*)&b1;
    visitVtbl((int**)*(int**)p, 3);
    ++p; cout << *p << endl;
    ++p; visitVtbl((int**)*(int**)p, 3);
    ++p; cout << *p << endl;
    return 0;
}

class Base  { ...... }; 
class Base1 : virtual public Base  { ...... };
class Base2 : virtual public Base  { ...... };
class Derived : public Base1, public Base2 { ...... };int main()
{
    Derived d;
    int *p = (int*)&d;
    visitVtbl((int**)*(int**)p, 3);
    ++p; cout << *p << endl;
    ++p; visitVtbl((int**)*(int**)p, 2);
    ++p; cout << *p << endl;
    ++p; cout << *p << endl;
    ++p; visitVtbl((int**)*(int**)p, 2);
    ++p; cout << *p << endl;
    return 0;
}

int main()
{
    Derived d;
    Base *basePtr = &d;
    Base1 *base1Ptr = &d;
    Base2 *base2Ptr = &d;
    Derived *derivedPtr = &d;
    cout << typeid(*basePtr).name() << endl;
    cout << typeid(*base1Ptr).name() << endl;
    cout << typeid(*base2Ptr).name() << endl;
    cout << typeid(*derivedPtr).name() << endl;
    return 0;
}
原文:http://blog.csdn.net/ljianhui/article/details/46408645