Re: [問題] 想請教一個C++考題

看板C_and_CPP作者 (我愛阿蓉)時間15年前 (2010/06/08 20:23), 編輯推噓3(3012)
留言15則, 6人參與, 最新討論串5/5 (看更多)
James大想問個問題 之前知道constructor不該呼叫virtual但其實寫的時候根本沒留意過... 現在想想 假如我有個class A和class B:public A 兩者都有個init() 各自有定義 我猜我會這樣寫 A::A() { Init() } B::B() { Init(); } 當A *p=new B時 剛好都會呼叫到各自的Init 但我寫的時候可能會因為有繼承關係 很不經思索的就加上virtual 這樣是剛好給我賽對??剛好是您說的 virtual在 constructor就不是virtual 那我把這套code翻成Java 哇靠.....Init兩次都跑B::的 所以Java應該會讓我程式邏輯錯掉嗎..... 我從沒這樣想過.....還沒遇到問題 看來要檢視一下自己的code 感覺問題不小@@ 所以說我不該再init加上virtual才是正確設計嗎?? 加了也剛好給我賽對??? 謝謝!!獲益良多 ※ 引述《james732 (好人超)》之銘言: : 說到 constructor 不要呼叫 virtual function 的問題 : 最近才遇到一個 Java 與 C++ 行為很不一樣的範例 : (難怪 Effective C++ 的作者有特別提到與 Java 的差異...可惜剛看書時候還不懂) : http://nopaste.csie.org/08053 : 這是化簡後的 Java code : 簡單的說,parent class 留下了 foo() 這個函式供 child 去 override : 當 clild 的建構子呼叫 parent 的建構子,就會執行 child 提供的 foo() : 在 Java 裡,這程式會輸出 OK : http://nopaste.csie.org/bd5f7 : 改寫成 C++,直覺是寫成這個樣子 : 可是 C++ 在這裡永遠執行 parent 的 foo,因此只會印出 ERROR : 遇到這問題的時候,還真的挺驚訝的 : 再翻開 Effective C++,才知道為什麼作者會寫 : 「在 Constructor 裡面,virtual function 不是 virtual function」了 : (手邊沒書,不過應該是這個意思) -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 219.87.64.222

06/08 20:45, , 1F
類似 init 的這種東西倒是比較常出現在 private 區段,
06/08 20:45, 1F

06/08 20:45, , 2F
所以也沒什麼人在加 virtual 的。
06/08 20:45, 2F

06/08 20:46, , 3F
如果因為特殊需求需要等 derived 的部分成員初始化後,
06/08 20:46, 3F

06/08 20:47, , 4F
才能初始化 base 的話,才比較可能出現在 protected 區段
06/08 20:47, 4F

06/08 20:47, , 5F
。但通常也不是 virtual,是從 derived 的 constructor 內
06/08 20:47, 5F

06/08 20:48, , 6F
指名往上層 call 而已。
06/08 20:48, 6F

06/08 20:49, , 7F
init不管加不加virtual,結果都是跑定義該ctor的class
06/08 20:49, 7F

06/08 20:50, , 8F
的init,或是其base class的init
06/08 20:50, 8F

06/08 22:42, , 9F
可是照james大寫的java版本 似乎就會重複跑B::init兩次阿?
06/08 22:42, 9F

06/08 22:42, , 10F
當然我不確定...super()是不是要手動加 應該不加也會跑base的
06/08 22:42, 10F

06/08 22:43, , 11F
吧~只是感覺這樣搬到java就會壞了耶
06/08 22:43, 11F

06/09 00:31, , 12F
其實C++改Java真的不能照招 爆點還多的...XDDD
06/09 00:31, 12F

06/09 13:32, , 13F
兩種不同的語言,會不一樣也是剛剛好吧
06/09 13:32, 13F

06/09 13:51, , 14F
也是啦 樓上說得對 XD
06/09 13:51, 14F

06/11 00:42, , 15F
回Q大..super()不需手動加(前提是super有default ctor)
06/11 00:42, 15F
文章代碼(AID): #1C3ZP9hL (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1C3ZP9hL (C_and_CPP)