国产探花免费观看_亚洲丰满少妇自慰呻吟_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ā)表

圖片精選

主站蜘蛛池模板: 保定市| 平陆县| 团风县| 德昌县| 岚皋县| 政和县| 招远市| 宜阳县| 泰兴市| 宣武区| 信宜市| 禄丰县| 油尖旺区| 张掖市| 英山县| 宿迁市| 德格县| 翁牛特旗| 濮阳市| 宜兰市| 伊宁市| 乌鲁木齐市| 清丰县| 定襄县| 昌吉市| 胶州市| 古丈县| 吉木萨尔县| 蓬溪县| 花莲市| 怀化市| 宜兰市| 博客| 绥滨县| 鄄城县| 荥阳市| 蒙山县| 岳池县| 灌南县| 长武县| 互助|