亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 維修 > 內存 > 正文

深度認識類,對象,內存分配

2020-07-05 10:30:03
字體:
來源:轉載
供稿:網友

武林網訊  如果兩個類,Parent和Child,Child繼承Parent,Parent有一個函數print(),有成員變量pVar,Child中有兩個函數print(),privatePrint(),有成員變量cVar,

現在 ,申明一個Parent類型的指針來指向一個Child的對象。

那么用這個指針可以調用privatePrint()函數嗎?可以用這個指針可以調用成員cVar嗎?

答案是:不能。

那如果Parent中有一個虛函數privatePrint(),那么可以調用到privatePrint()嗎?

答案是:可以。

首先我用C++試了一遍。C++的代碼如下
代碼
1 #include <iostream>
2
3 using namespace std;
4
5 class Prarent
6 {
7 public:
8 Prarent(){};
9 int pVar;
10 void print()
11 {
12 cout<<"I am parent"<< endl;
13 }
14 //virtual void privatePrint(){};
15 };
16
17 class Child : public Prarent
18 {
19 public:
20 Child(){};
21 int cVar;
22 void print()
23 {
24 cout<<"I am child"<< endl;
25 }
26 void privatePrint()
27 {
28 cout<<"I am child' function privatePrint()"<< endl;
29 }
30 };
31
32 void main()
33 {
34 Prarent *parent;
35 Child child; // 原先我竟然寫成 Child child = new Child(); 用久了C#, 都是C#惹的禍.
36 parent = &child;
37 parent->print();
38 // parent->privatePrint(); 編譯通不過.
39 // 1: 說明父類的指針雖然指向了子類的對象, 但是卻不能引用父類沒有申明的函數.
40 // 2: 但是你將privatePrint申明為父類的虛函數, 則上面的可以運行成功.
41 }
42
43

其實之前我沒有怎么在意這個問題。知道My sen Brother問了我。我才發現問題并非簡單。

經過了我們相互的討論之后,我們得到了一種解釋。

我不敢保證一定完全是對的。但是卻是我們自己的心得和體會。


理解這個問題。首先要明白兩個問題:1:類在內存是怎么存放的?(編譯階段實現)2:對象實例在內存中是怎么存放的?

1:類在內存是怎么存放的?

我根據以前Teacher Lei說過的一些內容,計算機組成,匯編語言,自己看過一些書,得到自己的一種思考。

其中一個類,通過編譯分別存在內存的兩塊地方,一個是代碼段,一個是數據段;

代碼段存放一個類的成員變量;(ie. 上面的pVar和cVar都是存放在代碼段中)

數據段存放一個類的成員函數表;(ie. 上面的print()和privatePrint()都存放于這里);

數據段中的每一個類的內存塊應該由兩個表填充,一個為虛函數表,一個為非虛函數表;

數據段中類的成員變量存放,如下:

int pVar

int cVar


代碼段中類的成員函數表存放,如下:
Parent()

Print()

Child()

Print()

pravtePrint()


下面來解釋 2:對象實例在內存中是怎么存放的?

我們拿上面的例子來說明:

當初始化一個Parent *parent 一個指針對象時,這時候parent所指向的地址就是100;


vPtr(虛函數指針) 地址:100

int pVar

當初始化一個Child類型 child 對象時,這時候child的地址就是200;(注意和指針不一樣)

vPtr(虛函數指針) 地址:200

int pVar

int cVar


首先:為什么這邊一定是這樣排列的

還記得Teacher Lei說過嗎?原因:子類在初始化的時候是先調用父類的構造函數??!

說明父類的成員一定是先被初始化的。

所以這邊的結構必然是這樣的。(這里很重要)

好了。到現在基本就把要知道的基礎知識解決了。

不知道讀著博客的人累了沒有。。呵呵。后面的更精彩。



現在 把child對象的地址賦值給指針parent(即 parent = &child)

先來看看 parent->cVar 為什么不行?!

第一步:parent->cVar 其實是一個地址的偏移過程,現在parent的地址是200;那么cVar就代表2個偏移量;

按說電腦是可以找到202的這個地址的值??墒菫槭裁床恍心??

第二步:在程序的編譯過程中,每一個的成員函數名都被當做一個偏移量。

就像這里,pVar代表量1個偏移。cVar代表2個偏移量。

第三步:parent是Parent類型的。這個很關鍵。因為在編譯的以后,parent已經初始化了一個最大偏移量max (這里的max為1)

第四步:結果已經很明顯了。因為parent的最大偏移量max 為1。程序根本找不著偏移量為2的變量地址。


然后看看 parent->privatePrint() 為什么不行?
還是那個關鍵點。parent是Parent類型的,還記得上面說類在內存中的加載方式嗎?parent指向的是Parent的內存塊。所以在那個內存塊中,根本找不著privatePrint()這個函數。

可是?有人因為會問了?為什么如果在Parent中申明了一個虛函數類型的privatePrint()就可以了呢?

還記得類的實例在內存中加載的那個圖嗎?每個類的前面都有一個的vPtr虛函數指針,他指向的是當前類的虛函數表。通過虛函數表中的privatePrint()也相當一個指針,指向了子類中實現父類虛函數的privatePrint(),自然就能找到了。
 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久亚洲精品成人| 欧美性xxxx极品hd满灌| 欧美黄网免费在线观看| 免费不卡在线观看av| 日韩精品小视频| 一本色道久久88亚洲综合88| 91精品中国老女人| 久久久人成影片一区二区三区| 亚洲欧美福利视频| 久久久久久国产精品美女| 日韩av在线网| 亚洲高清福利视频| 日韩av影院在线观看| 555www成人网| 亚洲视频一区二区三区| 欧美大成色www永久网站婷| 中文字幕亚洲综合久久筱田步美| 国产日韩欧美在线视频观看| 久久久亚洲精品视频| 午夜精品一区二区三区av| 亚洲日韩欧美视频一区| 国语自产精品视频在线看一大j8| 欧美韩国理论所午夜片917电影| 亚洲综合av影视| 丰满岳妇乱一区二区三区| 中文字幕av一区二区| 国产91精品青草社区| 欧美成人一区在线| 亚洲欧洲国产一区| 精品久久久久久亚洲国产300| 欧美精品在线视频观看| 亚洲第一视频在线观看| 国产精品入口免费视| 国产精品视频1区| 国产欧美一区二区三区视频| 国产精品免费一区二区三区都可以| 欧美极品少妇xxxxⅹ裸体艺术| 97超视频免费观看| 欧美精品在线免费| 欧美巨大黑人极品精男| 亚洲自拍欧美另类| 亚洲香蕉伊综合在人在线视看| 久久婷婷国产麻豆91天堂| 欧美最猛性xxxxx(亚洲精品)| 韩国日本不卡在线| 欧美高跟鞋交xxxxxhd| 国产美女91呻吟求| 欧美激情国内偷拍| 欧美www视频在线观看| 国产亚洲欧洲黄色| 国产69精品久久久久9| 国产91精品在线播放| 日韩电影第一页| 精品久久久久久中文字幕大豆网| 久久免费视频网| 国产日韩欧美自拍| 亚洲色图35p| 国产最新精品视频| 国内精品久久久久久影视8| 综合网日日天干夜夜久久| 91久久国产婷婷一区二区| 777国产偷窥盗摄精品视频| 一夜七次郎国产精品亚洲| 日本高清不卡在线| 1769国产精品| 久久99国产精品自在自在app| 亚洲精品中文字幕av| 国产91精品久| 91免费版网站入口| 欧美在线一级va免费观看| 欧美黑人性视频| 日韩在线观看免费全| 黑人巨大精品欧美一区免费视频| 欧美伦理91i| 欧美老女人性视频| 一本色道久久综合亚洲精品小说| 色系列之999| 久久久国产一区二区三区| 97香蕉超级碰碰久久免费软件| 日韩在线视频导航| 久久久国产成人精品| 中文字幕在线看视频国产欧美在线看完整| 中文在线资源观看视频网站免费不卡| 欧美中文字幕第一页| 欧美性xxxx在线播放| 欧美美最猛性xxxxxx| 亚洲国产精品久久久久秋霞蜜臀| 亚洲第一色中文字幕| 久久精品国产精品| 日韩视频精品在线| 日韩中文在线不卡| 欧美大全免费观看电视剧大泉洋| 亚洲电影天堂av| 欧美久久精品一级黑人c片| 亚洲自拍高清视频网站| 日韩视频免费在线观看| 欧美视频不卡中文| 国产精品99一区| 国产精品av网站| 精品亚洲男同gayvideo网站| 亚洲电影在线观看| 亚洲xxxx3d| 国产欧洲精品视频| 亚洲成年人影院在线| 成人av.网址在线网站| 国产欧美日韩综合精品| 亚洲男人的天堂在线播放| 欧美裸体xxxx极品少妇软件| 国产精品美女主播在线观看纯欲| 成人福利网站在线观看11| 中文亚洲视频在线| 激情久久av一区av二区av三区| 国产精品视频26uuu| 精品一区二区三区四区| 黄色精品一区二区| 亚洲第一福利网站| 国产精品爱啪在线线免费观看| 亚洲精品之草原avav久久| 国产免费一区二区三区在线能观看| 亚洲va欧美va国产综合剧情| 欧美剧在线观看| 欧美丰满老妇厨房牲生活| 亚洲午夜精品久久久久久久久久久久| 亚洲欧洲偷拍精品| 欧洲成人在线视频| 国产精品高潮呻吟久久av野狼| 亚洲欧美一区二区三区四区| 国产欧美精品日韩| 91av在线免费观看视频| 欧美丰满少妇xxxxx做受| 久久久久久久久久久久久久久久久久av| 日本不卡免费高清视频| 日韩视频在线免费观看| 超碰日本道色综合久久综合| 亚洲自拍av在线| 成人国产精品一区二区| 成人免费视频xnxx.com| 亚洲精品欧美极品| 欧美性猛交xxx| 久久天天躁狠狠躁夜夜av| 97超碰国产精品女人人人爽| 日韩欧美国产免费播放| 91精品国产高清自在线看超| 亚洲韩国欧洲国产日产av| 日本伊人精品一区二区三区介绍| 九九精品视频在线观看| 成人午夜在线视频一区| 国产精品免费在线免费| 国产精品美女久久久久av超清| 亚洲欧美日韩在线一区| 国产999精品久久久影片官网| 夜夜嗨av一区二区三区四区| 国产精品专区h在线观看| 亚洲理论片在线观看| 亚洲成人av在线播放| 成人黄色大片在线免费观看| 一区二区三区久久精品| 国产丝袜视频一区| 米奇精品一区二区三区在线观看| 亚洲色图13p| 欧美巨猛xxxx猛交黑人97人| 米奇精品一区二区三区在线观看| 久久亚洲综合国产精品99麻豆精品福利| 精品国产视频在线|