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

看板C_and_CPP作者 (電費不繳)時間8年前 (2016/02/04 16:37), 8年前編輯推噓4(4012)
留言16則, 5人參與, 最新討論串1/1
開發平台(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 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.123.101.71 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1454575078.A.395.html

02/04 16:46, , 1F
因為print1沒有virtual所以test會呼叫A的print1
02/04 16:46, 1F

02/04 16:47, , 2F
呼叫objB.print1 才會是B1
02/04 16:47, 2F

02/04 16:48, , 3F
建議你去搞清楚virtual的用法,就會了解輸出是A1
02/04 16:48, 3F

02/04 16:49, , 4F
所以當我呼叫test()時,test()裏頭呼叫的方法是呼叫b
02/04 16:49, 4F

02/04 16:49, , 5F
ase的?
02/04 16:49, 5F

02/04 16:54, , 6F
除非你定義virtual,不然都會呼叫base的
02/04 16:54, 6F

02/04 17:08, , 7F
謝謝,請問一下第二個問題有解決的辦法嗎?
02/04 17:08, 7F

02/04 23:42, , 8F
B():A(){ //balabala } A是base B繼承A 這樣?
02/04 23:42, 8F

02/04 23:55, , 9F
樓上正解, 如果要帶參數也是在這裡帶
02/04 23:55, 9F

02/04 23:56, , 10F
例如 Derived(int x): Base(x) {//...}
02/04 23:56, 10F
對,我想說明的就是樓上的這種寫法,可是這種寫法必須在宣告Derived的constructor時就已經 將他的實作也寫好,也就是必須在.h檔中就寫好constructor的實作,請問有辦法分離到 另一個Derived.cpp檔中嗎? ※ 編輯: ArcherState (118.171.26.244), 02/05/2016 13:56:01

02/05 14:07, , 11F
上面的寫法為何不能放在cpp檔
02/05 14:07, 11F

02/05 14:39, , 12F
可以寫在cpp中,可是這樣這樣子在h檔要怎麼宣告?
02/05 14:39, 12F

02/05 16:15, , 13F
跟一般建構子的宣告一樣
02/05 16:15, 13F

02/05 23:22, , 14F
這個寫法是定義的一部份, 所以跟著定義走
02/05 23:22, 14F

02/05 23:22, , 15F
宣告就照普通的方式宣告即可
02/05 23:22, 15F

02/06 00:12, , 16F
現在沒有電腦可以測試,明天試試看
02/06 00:12, 16F
文章代碼(AID): #1MimtcEL (C_and_CPP)