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

首頁 > 編程 > C++ > 正文

C++對象內存布局-單一繼承

2019-11-08 18:34:37
字體:
來源:轉載
供稿:網友

看《深度探索C++對象模型》有點力不從心。 找到了一篇博客寫的很好,把代碼跑了一篇,加深了理解 原博客:http://blog.csdn.net/haoel/article/details/3081328

內存分布規則:

虛函數表在最前面的位置。成員變量根據其繼承和聲明順序依次放在后面。在單一的繼承中,被重寫的虛函數在虛函數表中得到了更新。

來看實例:

這里寫圖片描述 代碼:

#include<iostream>using namespace std;class Parent {public: int iparent; Parent() :iparent(10) {} virtual void f() { cout << " Parent::f()" << endl; } virtual void g() { cout << " Parent::g()" << endl; } virtual void h() { cout << " Parent::h()" << endl; }};class Child : public Parent {public: int ichild; Child() :ichild(100) {} virtual void f() { cout << "Child::f()" << endl; } virtual void g_child() { cout << "Child::g_child()" << endl; } virtual void h_child() { cout << "Child::h_child()" << endl; }};class GrandChild : public Child{public: int igrandchild; GrandChild() :igrandchild(1000) {} virtual void f() { cout << "GrandChild::f()" << endl; } virtual void g_child() { cout << "GrandChild::g_child()" << endl; } virtual void h_grandchild() { cout << "GrandChild::h_grandchild()" << endl; }};/*使用了一個int** pVtab 來作為遍歷對象內存布局的指針這樣可以方便地像使用數組一樣來遍歷所有的成員包括其虛函數表了*/int main(){ typedef void(*Fun)(void); //指向函數的指針 GrandChild gc; int** pVtab = (int**)&gc; //二維 Fun pFun; cout << "[0] GrandChild::_vptr->" << endl; for (int i = 0; (Fun)pVtab[0][i] != NULL; i++){ pFun = (Fun)pVtab[0][i]; //把虛函數表對應函數賦給pFun cout << " [" << i << "] "; pFun(); } cout << "[1] Parent.iparent = " << (int)pVtab[1] << endl; cout << "[2] Child.ichild = " << (int)pVtab[2] << endl; cout << "[3] GrandChild.igrandchild = " << (int)pVtab[3] << endl; return 0;}

三個類的內存布局如下:

這里寫圖片描述

運行結果: 這里寫圖片描述


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 临泽县| 临清市| 南投县| 永嘉县| 贵溪市| 高雄县| 雷州市| 和林格尔县| 盱眙县| 德兴市| 南皮县| 衡阳市| 丹棱县| 乾安县| 武鸣县| 乌什县| 南溪县| 洛阳市| 大名县| 什邡市| 额尔古纳市| 略阳县| 郯城县| 和田县| 土默特左旗| 图片| 慈溪市| 台中市| 钟祥市| 香河县| 镇原县| 策勒县| 邛崃市| 凌海市| 大同县| 奎屯市| 扶余县| 全椒县| 凤台县| 林西县| 探索|