C++將派生類賦值給基類


  將派生類賦值給基類,即向上轉型。在C/C++中數據類型轉換的前提是,編譯器知道如何對數據進行取舍。類其實也是一種數據類型,也可以發生數據類型轉換,不過這種轉換只有在基類和派生類之間才有意義,並且只能將派生類賦值給基類,包括將派生類對象賦值給基類對象、將派生類指針賦值給基類指針、將派生類引用賦值給基類引用,這在 C++ 中稱為向上轉型(Upcasting)。相應地,將基類賦值給派生類稱為向下轉型(Downcasting)。

  向上轉型非常安全,可以由編譯器自動完成;向下轉型有風險,需要程序員手動干預。

1、將派生類對象賦值給基類對象

  賦值的本質是將現有的數據寫入已分配好的內存中,對象的內存只包含了成員變量,所以對象之間的賦值是成員變量的賦值,成員函數不存在賦值問題。因此就算將派生類的值賦給基類,若此時調用成員函數,仍舊調用的是基類的成員函數。換句話說,對象之間的賦值不會影響成員函數,也不會影響 this 指針

  將派生類對象賦值給基類對象時,會舍棄派生類新增的成員。這種轉換關系是不可逆的,只能用派生類對象給基類對象賦值,而不能用基類對象給派生類對象賦值。理由很簡單,基類不包含派生類的成員變量,無法對派生類的成員變量賦值。同理,同一基類的不同派生類對象之間也不能賦值。

2、將派生類指針賦值給基類指針

  除了可以將派生類對象賦值給基類對象(對象變量之間的賦值),還可以將派生類指針賦值給基類指針(對象指針之間的賦值)。與對象變量之間的賦值不同的是,對象指針之間的賦值並沒有拷貝對象的成員,也沒有修改對象本身的數據,僅僅是改變了指針的指向。

2.1 通過基類指針訪問派生類的成員

 

  將派生類指針賦值給基類指針時,通過基類指針只能使用派生類的成員變量,但不能使用派生類的成員函數。賦值之后,基類的指針指向了派生類的對象,即使得隱式指針this發生了變化,指向了派生類的對象,因此若調用成員函數,使用的是派生類對象中的成員變量。編譯器雖然通過指針的指向來訪問成員變量,但是卻不通過指針的指向來訪問成員函數:編譯器通過指針的類型來訪問成員函數。因此將派生類指針賦值給基類指針,使用的是派生類的成員變量,調用的成員函數是基類的成員函數。

  概括起來說就是:編譯器通過指針來訪問成員變量,指針指向哪個對象就使用哪個對象的數據;編譯器通過指針的類型來訪問成員函數,指針屬於哪個類的類型就使用哪個類的函數

3、將派生類引用賦值給基類引用

  引用在本質上是通過指針的方式實現的。與指針一樣,雖然使用了派生類對象的成員變量,但是卻沒有使用派生類的成員函數。最后需要注意的是:向上轉型后通過基類的對象、指針、引用只能訪問從基類繼承過去的成員(包括成員變量和成員函數),不能訪問派生類新增的成員

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM