Re: [問題] 想請教一個C++考題
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
06/08 20:45, 1F
→
06/08 20:45, , 2F
06/08 20:45, 2F
→
06/08 20:46, , 3F
06/08 20:46, 3F
→
06/08 20:47, , 4F
06/08 20:47, 4F
→
06/08 20:47, , 5F
06/08 20:47, 5F
→
06/08 20:48, , 6F
06/08 20:48, 6F
推
06/08 20:49, , 7F
06/08 20:49, 7F
→
06/08 20:50, , 8F
06/08 20:50, 8F
→
06/08 22:42, , 9F
06/08 22:42, 9F
→
06/08 22:42, , 10F
06/08 22:42, 10F
→
06/08 22:43, , 11F
06/08 22:43, 11F
→
06/09 00:31, , 12F
06/09 00:31, 12F
推
06/09 13:32, , 13F
06/09 13:32, 13F
→
06/09 13:51, , 14F
06/09 13:51, 14F
推
06/11 00:42, , 15F
06/11 00:42, 15F
討論串 (同標題文章)