看板 C_and_CPP 關於我們 聯絡資訊
開發平台(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
sammsiontir: 因為print1沒有virtual所以test會呼叫A的print1 02/04 16:46
sammsiontir: 呼叫objB.print1 才會是B1 02/04 16:47
sammsiontir: 建議你去搞清楚virtual的用法,就會了解輸出是A1 02/04 16:48
ArcherState: 所以當我呼叫test()時,test()裏頭呼叫的方法是呼叫b 02/04 16:49
ArcherState: ase的? 02/04 16:49
sammsiontir: 除非你定義virtual,不然都會呼叫base的 02/04 16:54
ArcherState: 謝謝,請問一下第二個問題有解決的辦法嗎? 02/04 17:08
taies: B():A(){ //balabala } A是base B繼承A 這樣? 02/04 23:42
LPH66: 樓上正解, 如果要帶參數也是在這裡帶 02/04 23:55
LPH66: 例如 Derived(int x): Base(x) {//...} 02/04 23:56
對,我想說明的就是樓上的這種寫法,可是這種寫法必須在宣告Derived的constructor時就已經 將他的實作也寫好,也就是必須在.h檔中就寫好constructor的實作,請問有辦法分離到 另一個Derived.cpp檔中嗎? ※ 編輯: ArcherState (118.171.26.244), 02/05/2016 13:56:01
IKAFIRE: 上面的寫法為何不能放在cpp檔 02/05 14:07
ArcherState: 可以寫在cpp中,可是這樣這樣子在h檔要怎麼宣告? 02/05 14:39
taies: 跟一般建構子的宣告一樣 02/05 16:15
LPH66: 這個寫法是定義的一部份, 所以跟著定義走 02/05 23:22
LPH66: 宣告就照普通的方式宣告即可 02/05 23:22
ArcherState: 現在沒有電腦可以測試,明天試試看 02/06 00:12