[問題] 動態繫結的結果問題

作者: ArcherState (電費不繳)   2016-02-04 16:37:55
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) clang++
額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) null
問題(Question): 以下是我的程式碼
http://i.imgur.com/eBCsnT2.png
另外問個問題,當我繼承一個base class時,如何在dirived class的construct中的
initializer呼叫base class來進行初始化,因為我習慣一個class寫成一個.h,而這個
問題無法解決的情況下,都讓我必須在.h檔裡面就寫完整個constructor的實作。
預期的正確結果(Expected Output):
A1 A2 B1 A2 B1 C2
預期應該是這樣,我的想法是objB是以class B的類別,理當來說print1已經被override
,為什麼在輸出結果時objB的print1還是輸出A1,這個問題在延續到objC也是存在。
謝謝。
錯誤結果(Wrong Output):
A1 A2 A1 A2 A1 C2
作者: sammsiontir ( )   2016-02-04 16:46:00
因為print1沒有virtual所以test會呼叫A的print1呼叫objB.print1 才會是B1建議你去搞清楚virtual的用法,就會了解輸出是A1
作者: ArcherState (電費不繳)   2016-02-04 16:49:00
所以當我呼叫test()時,test()裏頭呼叫的方法是呼叫base的?
作者: sammsiontir ( )   2016-02-04 16:54:00
除非你定義virtual,不然都會呼叫base的
作者: ArcherState (電費不繳)   2016-02-04 17:08:00
謝謝,請問一下第二個問題有解決的辦法嗎?
作者: taies (akira)   2016-02-04 23:42:00
B():A(){ //balabala } A是base B繼承A 這樣?
作者: LPH66 (-6.2598534e+18f)   2016-02-04 23:55:00
樓上正解, 如果要帶參數也是在這裡帶例如 Derived(int x): Base(x) {//...}
作者: IKAFIRE (沒有)   2016-02-05 14:07:00
上面的寫法為何不能放在cpp檔
作者: ArcherState (電費不繳)   2016-02-05 14:39:00
可以寫在cpp中,可是這樣這樣子在h檔要怎麼宣告?
作者: taies (akira)   2016-02-05 16:15:00
跟一般建構子的宣告一樣
作者: LPH66 (-6.2598534e+18f)   2016-02-05 23:22:00
這個寫法是定義的一部份, 所以跟著定義走宣告就照普通的方式宣告即可
作者: ArcherState (電費不繳)   2016-02-06 00:12:00
現在沒有電腦可以測試,明天試試看

Links booklink

Contact Us: admin [ a t ] ucptt.com