我們先來看一段**:
1 #include 2執行結果為:3using
namespace
std;
4classa 5
1213
void
funca( )
1417
};18
19classb20
2728
void
funcb( )
2932
};33
34class c :public a, publicb35
42void
funcc()
4346
};47
48int
main()
49
第乙個基類子物件a的起始位址是與派生類物件c是重合的。我們來看一張:
上圖演示了this指標是如何調整的。在派生類的物件中,基類是作為派生類的子物件存在的,稱為基類子物件,當派生類只繼承於乙個基類時,基類子物件的起始位址是與派生類物件相同的,而當派生類同時繼承於多個基類時(多重繼承,這裡暫時不考慮虛擬繼承)
第乙個基類子物件的起始位址是與派生類物件重合的,而後續基類子物件的起始位址與派生類物件依次相差前面的基類子物件的長度,比如,d同時派生於a、b、c。d物件的起始位址是0,那麼a子物件的起始位址也是0,b子物件的起始位址是0+sizeof(a),而c物件的起始位址為0 + sizeof(a) + sizeof(b)。上面的例子c類派生於a,b。c類物件的位址是006ffd4c,那麼a子物件的起始位址和c類物件的起始位址是一樣的為006ffd4c,b類物件的起始位址為006ffd4c + sizeof(a) = 006ffd4c + 4 = 006ffd50
如果我們把程修改成如下,輸入結果會怎麼樣呢?
1 #include 2輸出結果為:3using
namespace
std;
4classa 5
1213
void
funca( )
1417
};18
19classb20
2728
void
funcb( )
2932
};33
34class c :public a, publicb35
42void
funcc()
4346
void
funcb()
4750
};51
52int
main()
53
可以看到,此時三個值都相同了,c類override基類子物件b的funcb函式,此時funb()中的this指標指向c物件的起始位址。
this指標調整
派生類物件它是包含 基類子物件的。1 如果派生類只從乙個基類繼承的話,那麼這個派生類物件的位址和基類子物件的位址相同。第乙個基類子物件的開始位址和派生類物件的開始位址相同。後續這些基類子物件的開始位址 和派生類物件的開始位址相差多少呢?那就得把前邊那些基類子物件所占用的記憶體空間乾掉。總結 你呼叫哪...
調整程序的特權
通過openprocess process all access,false,did 獲取id較低程序的控制代碼時可能會得到錯誤 這些程序都是保持系統活動的系統服務。乙個普通使用者程序不允許執行針對系統服務的所有操作。如果乙個程式意外終止了乙個系統服務,那麼整個系統都將崩潰。因此,乙個程序只有擁有確...
調整max allowed packet的大小
max allowed packet 包或任何生成的 中間字串的最大大小。這個過程大部分發生在load data file中,有時也發生在update,insert中。包訊息緩衝區初始化為net buffer length位元組,但需要時可以增長到max allowed packet位元組。該值預設...