伊莉討論區

標題: 初學 c++ 關於繼承的和upcast的問題 [打印本頁]

作者: 想你過得好嗎    時間: 2017-7-19 09:06 PM     標題: 初學 c++ 關於繼承的和upcast的問題

各位大大好,小弟最近在自學OOP的課(用到的語言是C++),今天在唸完繼承得時候遇到了一些問題,希望各位大大可以幫忙解惑
1.
[attach]119572633[/attach]
關於這個程式我已經把main宣告成 class B friend了,而protected member不是可以被他以下的派生類別和派生類別的朋友們使用嗎?那為什麼這邊不能呼叫foo?還是說我有哪邊搞錯了?
2
[attach]119572647[/attach]
第二個問題的話就是在第17行的地方obj1會不會被upcastclass A的物件?因為我記得member function裡面不是會隱藏的塞一個object pointer?所以我想說geta其實裡面參數應該是geta(A* this),那這樣我丟一個Bobject給他,他會不會把自己做upcast?(就像平常把指向A類別的物件的指標指向B類別的物件的時候會做upcast一樣?)
3.[attach]119572649[/attach]
第三個問題我自己覺得有點蠢可是還是要問一下,在17行的時候因為我用指向A的pointer指向B的物件obj1,所以obj1會被upcast成class A的型態?我記得這是編譯器自己幫我們做的隱性轉換(implicit conversion),那請問在17行以下是不是obj1都會被當成是class A的物件呢?還是只有在我用ptr來取用obj1裡的成員的時候他會被當成是class A的物件其他時候他都還是屬於class B的物件?我在下一行試著印出obj1裡的C成功了,所以說是因為他只有在被ptr指到的時候是當A的物件其他時候都不變還是B的物件嗎?來是說這邊編譯器又把他隱性轉型轉回B了?還請大大門開釋

PS:我的問題有點多而且蠻奇怪的,希望各位大大可以幫忙解惑

作者: johnwanz    時間: 2017-7-20 10:59 AM

以下是我的推測, 參考看看
1. 你用A* ptr來參考B obj, 所以面對 *ptr, 就是一個A; A裡面當然沒有宣告過main.
2. 我不太清楚Upcast實作. 但是以A* ptr來操作Obj, 就只是以A的方式來操作Obj.
3. 依照你所參考的型別來使用.
  你用ptr操作, 目標物件就是一個A. ptr操作不接受Class B的內容.
  你用obj操作, 目標物件就是一個B. obj具有Class B的全部內容.
  編譯器, 應該是依照你所宣告的變數型別, 其所包含的能力, 來操作該目標物件.




歡迎光臨 伊莉討論區 (http://a401.file-static.com/) Powered by Discuz!