国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > C++ > 正文

C++對(duì)象內(nèi)存布局-多重繼承

2019-11-08 03:14:44
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

看《深度探索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)存布局如下:

這里寫圖片描述


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 岳普湖县| 平凉市| 静安区| 泽库县| 雷州市| 天峻县| 宁陕县| 长治县| 昌乐县| 宁津县| 灯塔市| 登封市| 平泉县| 岱山县| 潍坊市| 包头市| 东丽区| 鹤庆县| 马龙县| 济源市| 乌拉特后旗| 海兴县| 盖州市| 河间市| 龙岩市| 历史| 镇安县| 会同县| 四会市| 漯河市| 梅州市| 宣恩县| 敖汉旗| 昌吉市| 威信县| 和政县| 天门市| 苏尼特左旗| 郴州市| 横峰县| 梁平县|