首先,給出基類animal和子類fish ios
一.基類指針和子類指針之間相互賦值
(1)將子類指針賦值給基類指針時,不須要進行強制類型轉換,C++編譯器將自動進行類型轉換。由於子類對象也是一個基類對象。web
(2)將基類指針賦值給子類指針時,須要進行強制類型轉換,C++編譯器將不自動進行類型轉換。由於基類對象不是一個子類對象。子類對象的自增部分是基類不具備的。
執行如下代碼,看看會報什麼錯誤:app
編譯時,報以下錯誤信息:函數
--------------------Configuration: CPlusPlusPrimer - Win32 Debug-------------------- Compiling... CPlusPlusPrimer.cpp E:\Study\example\CPlusPlusPrimer\CPlusPlusPrimer.cpp(94) : error C2440: '=' : cannot convert from 'class animal *' to 'class fish *' Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast Error executing cl.exe.
CPlusPlusPrimer.exe - 1 error(s), 0 warning(s)
根據以上錯題提示信息,對代碼作以下修改:oop
再次編譯,經過。
二.子類指針賦給基類指針時內存分析 (1)int變量賦給char變量ui
整型int轉換爲char類型時,只有一個字節的內容可以放進char類型,剩下的三個字節內容放不下,被截掉,丟失精度。 兩個變量或者對象進行轉換時,必定要看二者的內存模型是否互相匹配。
(2)子類fish指針賦給基類animal指針 下面看看子類fish指針賦給基類animal指針時,內存的變化: 當咱們構造fish類的對象時,首先要調用animal類的構造函數去構造animal類的構造函數,而後才調用fish類的構造函數完成自身部分的構造,從而拼接出一個完整的fish對象。當咱們將fish類對象轉換爲animal類對象時,該對象就被認爲是原對象整個內存模型的上半部分,也就是圖中animal對象的內存部分。當咱們利用類型轉換後的對象指針去調用它的方法時,天然是調用它所在的內存中的方法。 在這裏,animal類對象相似於char類型的對象,fish類對象相似於int類型的對象,將fish類對象賦給animal類對象時,會截取fish類對象自身的部分,剩下fish類對象中的animal部分。
(2)基類animal指針賦給子類fish指針 基類animal對象包含的信息少,類fish對象包含的信息多,將信息少的對象直接轉換爲信息多的對象時(沒有強制類型轉換),顯然是沒法構造出多出的信息。在編譯時,也會發生以下錯誤:error C2440: '=' : cannot convert from 'class animal *' to 'class fish *'。 這時,須要作強制類型轉換:this