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

看板C_and_CPP作者 (哇哩)時間15年前 (2010/06/07 23:13), 編輯推噓7(7015)
留言22則, 7人參與, 最新討論串1/5 (看更多)
想請教各位版大...以下是一個C++面試題目,要考執行結果印出的是什麼 程式碼如下: #include <iostream> #include <cstdio> using namespace std; class A { public: A() { p(); } ~A(){ p(); } virtual void p() { q(); } virtual void q() { cout<<"A"; } }; class B:public A { public: B() { p(); } ~B() { p(); } void q() { cout<<"B"; } }; int main() { A *ptr=new B; delete ptr; return 0; } 標準答案為ABA,與我實際跑過的結果相符。我比較迷惑的是為什麼 執行解構子的過程只印了最後一個A呢?ptr此時指向的是B物件,不 是應該先執行物件B的解構子嗎?麻煩各位指正小弟的觀念了,謝謝! -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 122.124.166.118

06/07 23:20, , 1F
因為 ~A 不是 virtual 所以執行的是 A 的 dtor
06/07 23:20, 1F

06/07 23:20, , 2F
你在 ~A 上加個 virtual 就會呼叫到 B 的 dtor 了
06/07 23:20, 2F

06/07 23:25, , 3F
銷毀物件時,不是都先執行子類別的解構子,然後再執行父類
06/07 23:25, 3F

06/07 23:25, , 4F
dtor裡不適合執行cout,因為cout的dtor可能先執行
06/07 23:25, 4F

06/07 23:26, , 5F
別的解構子嗎??
06/07 23:26, 5F
※ 編輯: NcuCsie 來自: 122.124.166.118 (06/07 23:32)

06/07 23:45, , 6F
順便請教一下,為何一定要用物件指標呼叫虛擬函式?
06/07 23:45, 6F

06/07 23:49, , 7F
上一行的問題是想請其他大大解答的。
06/07 23:49, 7F

06/07 23:57, , 8F
不一定要用指標呼叫阿 你是要問多型??
06/07 23:57, 8F

06/08 00:21, , 9F
用 reference 也能呼叫。主要是當初考慮到 by value 傳遞
06/08 00:21, 9F

06/08 00:21, , 10F
物件必會發生切割。不過這邊講的是指多型的部分。
06/08 00:21, 10F

06/08 00:23, , 11F
讓人感覺呼叫不到 virtual function,是因為已經切割了。
06/08 00:23, 11F

06/08 00:48, , 12F
ctor 內不應該呼叫 virtual function
06/08 00:48, 12F

06/08 00:53, , 13F
雖然硬要做也是可以...不過能省則省
06/08 00:53, 13F

06/08 00:56, , 14F
l大 你說ctor內部該呼叫virtual func這我知道 但如果呼叫了會
06/08 00:56, 14F

06/08 00:56, , 15F
有什麼風險嗎?
06/08 00:56, 15F

06/08 00:57, , 16F
另外就算是 Base*p = new Derived;也不該在Base建構子呼叫
06/08 00:57, 16F

06/08 00:58, , 17F
virtual Base::Init()應該要等建構完成在手動呼叫 ->Init()嗎
06/08 00:58, 17F

06/08 00:59, , 18F
因為不知道在ctor裡vtable是何時建立吧
06/08 00:59, 18F

06/08 00:59, , 19F
想一想 好像Derived專屬的Init不該寫在Base當virtual
06/08 00:59, 19F

06/08 01:00, , 20F
應該寫在Derive內當一般member fun Derive::ctrs呼叫就好嗎?
06/08 01:00, 20F

06/08 01:01, , 21F
有沒有什麼情況是~必須要virtual 又好像可以在ctrs就呼叫
06/08 01:01, 21F

06/08 01:02, , 22F
但其實應該拿到外面手動呼叫的例子呢??
06/08 01:02, 22F
文章代碼(AID): #1C3GoBQ0 (C_and_CPP)
文章代碼(AID): #1C3GoBQ0 (C_and_CPP)