路過的各位大佬救救孩子吧:物件間的賦值要在同型別下,為什么第一個框里面的賦值就不會報錯,第二個框就會報錯,第二個框我該怎么改呢?
uj5u.com熱心網友回復:
你可以這么理解子類是在父類的基礎上擴展的,從某種意義上來說子類的記憶體資訊量要大于(至少是不小于)父類的記憶體資訊量(在父類的記憶體資訊上增加資訊)
所以
父類變數=子類變數,因為父類變數的記憶體資訊少,把子類的記憶體空間縮小后賦給父類變數,不會造成記憶體越界(本來就屬于子類的記憶體空間,怎么縮小也還是在合法的記憶體空間),所以沒問題
子類變數=父類變數,因為子類變數的記憶體資訊多,把父類的記憶體空間擴大后賦給子類變數,會造成記憶體越界(擴大到本來不屬于父類的記憶體),所以有問題
uj5u.com熱心網友回復:
可能animal是向下兼容的,也就是樓上說的,父類和子類,舉個不恰當的例子,就像string和char的關系一樣,string可以=char 而不會丟失char的細節,而char=string 是不可以的uj5u.com熱心網友回復:
那么我該怎么改呢?
uj5u.com熱心網友回復:
你要是不怕記憶體越界產生問題,你可以用強行轉換試試d2 = *((Dog*)&a1);
uj5u.com熱心網友回復:
大佬除了強行轉換還有其他法子嗎?
uj5u.com熱心網友回復:
嗯嗯,明白了,謝謝大佬支持 。
uj5u.com熱心網友回復:
那就記憶體拷貝
memcpy(&b2, &a1, sizeof(b2));
uj5u.com熱心網友回復:
你要是不怕記憶體越界產生問題,你可以用強行轉換試試
d2 = *((Dog*)&a1);
大佬除了強行轉換還有其他法子嗎?
那就記憶體拷貝
memcpy(&b2, &a1, sizeof(b2));
大佬能給我解釋下這個拷貝記憶體嘛?
uj5u.com熱心網友回復:
你要是不怕記憶體越界產生問題,你可以用強行轉換試試
d2 = *((Dog*)&a1);
大佬除了強行轉換還有其他法子嗎?
那就記憶體拷貝
memcpy(&b2, &a1, sizeof(b2));
大佬能給我解釋下這個拷貝記憶體嘛?
uj5u.com熱心網友回復:
你要是不怕記憶體越界產生問題,你可以用強行轉換試試
d2 = *((Dog*)&a1);
大佬除了強行轉換還有其他法子嗎?
那就記憶體拷貝
memcpy(&b2, &a1, sizeof(b2));
大佬能給我解釋下這個拷貝記憶體嘛?
uj5u.com熱心網友回復:
第二個框的改法就是去掉第二個框……,相信我,它不是你想要的。uj5u.com熱心網友回復:
你這個做法是想 將父類物件_a1 的屬性 復制給 子類物件_d2 ,是不是可以通過多載賦值運算子來實作呢?uj5u.com熱心網友回復:
第二個框的改法就是去掉第二個框……,相信我,它不是你想要的。


是我想要的。
uj5u.com熱心網友回復:
你這個做法是想 將父類對象_a1 的屬性 復制給 子類物件_d2 ,是不是可以通過多載賦值運算子來實作呢?
多載賦值運算子?
uj5u.com熱心網友回復:
大佬能給我解釋下這個拷貝記憶體嘛?
記憶體拷貝就是把a1的記憶體資訊復制給d2,其實這些都不安全
建議都轉成指標,再用dynamic_cast,再復制到你的變數的記憶體可能更好一些
uj5u.com熱心網友回復:
大佬能給我解釋下這個拷貝記憶體嘛?
記憶體拷貝就是把a1的記憶體資訊復制給d2,其實這些都不安全
建議都轉成指標,再用dynamic_cast,再復制到你的變數的記憶體可能更好一些
嗯嗯,好的,謝謝大佬。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/80197.html
標籤:C++ 語言
下一篇:初學者求教
