伊莉討論區
標題:
初學 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
會不會被
upcast
成
class A
的物件
?
因為我記得
member function
裡面不是會隱藏的塞一個
object pointer
嗎
?
所以我想說
geta
其實裡面參數應該是
geta(A* this)
,那這樣我丟一個
B
的
object
給他,他會不會把自己做
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!