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
*/
View Code

相关文章:

  • 2021-10-03
  • 2021-11-22
  • 2022-12-23
  • 2022-01-19
  • 2021-10-27
猜你喜欢
  • 2021-07-30
  • 2021-09-14
  • 2021-09-21
  • 2021-09-13
  • 2022-12-23
  • 2021-09-15
相关资源
相似解决方案