作者QQ29 (我愛阿蓉)
看板C_and_CPP
標題Re: [問題] 想請教一個C++考題
時間Tue Jun 8 20:23:34 2010
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