看《深度探索C++對(duì)象模型》有點(diǎn)力不從心。 找到了一篇博客寫的很好,把代碼跑了一篇,加深了理解 原博客:http://blog.csdn.net/haoel/article/details/3081328
內(nèi)存分布規(guī)則:
每個(gè)父類都有自己的虛表。子類的成員函數(shù)被放到了第一個(gè)父類的表中。內(nèi)存布局中,其父類布局依次按聲明順序排列。每個(gè)父類的虛表中的f()函數(shù)都被overwrite成了子類的f()。這樣做就是為了解決不同的父類類型的指針指向同一個(gè)子類實(shí)例,而能夠調(diào)用到實(shí)際的函數(shù)。來(lái)看實(shí)例: 假設(shè)有下面這樣一個(gè)類的繼承關(guān)系。注意:子類只重載了父類的f()函數(shù),而還有一個(gè)是自己的函數(shù)(我們這樣做的目的是為了用g1()作為一個(gè)標(biāo)記來(lái)標(biāo)明子類的虛函數(shù)表)。而且每個(gè)類中都有一個(gè)自己的成員變量:
代碼:
#include<iostream>using namespace std;class Base1 {public: int ibase1; Base1() :ibase1(10) {} virtual void f() { cout << "Base1::f()" << endl; } virtual void g() { cout << "Base1::g()" << endl; } virtual void h() { cout << "Base1::h()" << endl; }};class Base2 {public: int ibase2; Base2() :ibase2(20) {} virtual void f() { cout << "Base2::f()" << endl; } virtual void g() { cout << "Base2::g()" << endl; } virtual void h() { cout << "Base2::h()" << endl; }};class Base3 {public: int ibase3; Base3() :ibase3(30) {} virtual void f() { cout << "Base3::f()" << endl; } virtual void g() { cout << "Base3::g()" << endl; } virtual void h() { cout << "Base3::h()" << endl; }};class Derive : public Base1, public Base2, public Base3 {public: int iderive; Derive() :iderive(100) {} virtual void f() { cout << "Derive::f()" << endl; } virtual void g1() { cout << "Derive::g1()" << endl; }};int main(){ typedef void(*Fun)(void); Fun pFun; Derive d; int** pVtab = (int**)&d; cout << "[0] Base1::_vptr->" << endl; pFun = (Fun)pVtab[0][0]; cout << " [0] "; pFun(); pFun = (Fun)pVtab[0][1]; cout << " [1] "; pFun(); pFun = (Fun)pVtab[0][2]; cout << " [2] "; pFun(); pFun = (Fun)pVtab[0][3]; cout << " [3] "; pFun(); pFun = (Fun)pVtab[0][4]; cout << " [4] "; cout << pFun << endl; cout << "[1] Base1.ibase1 = " << (int)pVtab[1] << endl; int s = sizeof(Base1) / 4; cout << "[" << s << "] Base2::_vptr->" << endl; pFun = (Fun)pVtab[s][0]; cout << " [0] "; pFun(); pFun = (Fun)pVtab[s][1]; cout << " [1] "; pFun(); pFun = (Fun)pVtab[s][2]; cout << " [2] "; pFun(); pFun = (Fun)pVtab[s][3]; cout << " [3] "; cout << pFun << endl; cout << "[" << s + 1 << "] Base2.ibase2 = " << (int)pVtab[s + 1] << endl; s = s + sizeof(Base2) / 4; cout << "[" << s << "] Base3::_vptr->" << endl; pFun = (Fun)pVtab[s][0]; cout << " [0] "; pFun(); pFun = (Fun)pVtab[s][1]; cout << " [1] "; pFun(); pFun = (Fun)pVtab[s][2]; cout << " [2] "; pFun(); pFun = (Fun)pVtab[s][3]; cout << " [3] "; cout << pFun << endl; s++; cout << "[" << s << "] Base3.ibase3 = " << (int)pVtab[s] << endl; s++; cout << "[" << s << "] Derive.iderive = " << (int)pVtab[s] << endl; return 0;}Derive類的內(nèi)存布局如下:
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注