看板 C_and_CPP 關於我們 聯絡資訊
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
tinlans:類似 init 的這種東西倒是比較常出現在 private 區段, 06/08 20:45
tinlans:所以也沒什麼人在加 virtual 的。 06/08 20:45
tinlans:如果因為特殊需求需要等 derived 的部分成員初始化後, 06/08 20:46
tinlans:才能初始化 base 的話,才比較可能出現在 protected 區段 06/08 20:47
tinlans:。但通常也不是 virtual,是從 derived 的 constructor 內 06/08 20:47
tinlans:指名往上層 call 而已。 06/08 20:48
loveflames:init不管加不加virtual,結果都是跑定義該ctor的class 06/08 20:49
loveflames:的init,或是其base class的init 06/08 20:50
QQ29:可是照james大寫的java版本 似乎就會重複跑B::init兩次阿? 06/08 22:42
QQ29:當然我不確定...super()是不是要手動加 應該不加也會跑base的 06/08 22:42
QQ29:吧~只是感覺這樣搬到java就會壞了耶 06/08 22:43
james732:其實C++改Java真的不能照招 爆點還多的...XDDD 06/09 00:31
ilovebbs:兩種不同的語言,會不一樣也是剛剛好吧 06/09 13:32
james732:也是啦 樓上說得對 XD 06/09 13:51
tomap41017:回Q大..super()不需手動加(前提是super有default ctor) 06/11 00:42