标签:c++对象模型 对象内存布局 虚函数表 运行时类型识别 虚函数调用机制
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;
}
标签:c++对象模型 对象内存布局 虚函数表 运行时类型识别 虚函数调用机制
原文地址:http://blog.csdn.net/ljianhui/article/details/46408645