[問題] 關於 C++ 的繼承與建構解構式

看板C_and_CPP作者 (oo)時間10年前 (2013/12/17 17:21), 編輯推噓9(9018)
留言27則, 8人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) G++ 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) 問題(Question): http://codepad.org/r7PfzyAs 各位大大 今天去趨勢科技面試 其中有一題 C++ 考題是關於物件導向繼承的問題 , Code 如下 題目問到: What's the output? 回家以後把它 keyin compiler 後還是不是很了解 想請問各位為何順序是這樣呢 我應該怎麼理解(or背)它呢? 還有 A a* = new B(); 與 A a* = new A(); 在記憶體空間與實作上我應該怎麼理解呢? (我只知道 A a* = new B()時 , virtual關鍵字會有影響) 謝謝各位! 餵入的資料(Input):預期的正確結果(Expected Output): B class B object inherit A Ain Bin Bout Aout A class B object Ain Bin Aout 錯誤結果(Wrong Output): 無錯誤 程式碼(Code):(請善用置底文網頁, 記得排版) http://codepad.org/r7PfzyAs #include <iostream> using namespace std; class A { public: A(){cout << "Ain \n";} ~A(){cout << "Aout \n";} }; class B : public A { public: B(){cout << "Bin \n";} ~B(){cout << "Bout \n";} }; int main() { cout << "B class B object inherit A\n"; B *b = new B(); delete b; cout << "A class B object\n"; A *a = new B(); delete a; return 0; } 補充說明(Supplement): -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.36.177.141

12/17 17:27, , 1F
這跟virtual沒有關係,純粹只是繼承
12/17 17:27, 1F

12/17 17:27, , 2F
至於這方面的東西,我想大部分的書有交到繼承都會說。
12/17 17:27, 2F

12/17 17:32, , 3F
順序的方面也可以用想的,因為很合情合理@@
12/17 17:32, 3F

12/17 17:36, , 4F
可有 virtual dtor 影響 delete a; ,然後沒 virtual ctor
12/17 17:36, 4F

12/17 17:36, , 5F
這根virtual有重要關係!其實就是考virtual dtor
12/17 17:36, 5F

12/17 17:39, , 6F
順序可以想成,base 是最內環故先建,而最 derived 的類別
12/17 17:39, 6F

12/17 17:39, , 7F
位於最外環,故最晚建造,但最先拆,反正你就死背就好。
12/17 17:39, 7F

12/17 17:51, , 8F
看到 purpose 大大說的部分的 sample code了
12/17 17:51, 8F

12/17 17:52, , 9F
http://tinyurl.com/l9u77dt 所以是語言預設實作的關係?
12/17 17:52, 9F

12/17 17:53, , 10F
感謝提供關鍵字 :) 雖然死背那部分還是不太理解 @@
12/17 17:53, 10F

12/17 18:20, , 11F
不要死背,這個順序是精心設計過的
12/17 18:20, 11F

12/17 18:21, , 12F
derived類別中的成員可能會依賴base的資訊
12/17 18:21, 12F

12/17 18:21, , 13F
所以base要先建構好,才能建構derived
12/17 18:21, 13F

12/17 18:22, , 14F
反過來base不會依賴derived的資訊(他根本不知道derived
12/17 18:22, 14F

12/17 18:23, , 15F
所以base要最早建構、最晚解構
12/17 18:23, 15F

12/17 18:32, , 16F
有感覺理解了 謝謝各位大大!!
12/17 18:32, 16F

12/17 18:40, , 17F
沒老爸怎麼會有兒子,不過解構就不通了
12/17 18:40, 17F

12/17 18:54, , 18F
解構也一樣: 兒子還沒拆之前怎麼能拆老爸
12/17 18:54, 18F

12/18 09:03, , 19F
delete a是故意不加虛擬的吧
12/18 09:03, 19F

12/18 09:04, , 20F
所以本題只是在考繼承不是?
12/18 09:04, 20F

12/18 09:05, , 21F
可是如果多問如何改善,就有虛擬dtor了
12/18 09:05, 21F

12/18 09:07, , 22F
解構也有可能依賴到父,先拆會GG
12/18 09:07, 22F

12/18 09:09, , 23F
然後要注意的是new跟虛擬無關,沒有虛擬ctor
12/18 09:09, 23F

12/20 13:37, , 24F
那請問可以解釋一下為何沒virtual dtor會直接拆base?
12/20 13:37, 24F

12/20 14:09, , 25F
因為資訊不足,如何解讀 delete a; 是由編譯器決定,而
12/20 14:09, 25F

12/20 14:10, , 26F
編譯器只能知道 a 物件是 class A,而 ~A() 又不是virtual
12/20 14:10, 26F

12/20 14:17, , 27F
C++ 為什麼需要加 virtual 呢?
12/20 14:17, 27F
文章代碼(AID): #1Ii1TyaX (C_and_CPP)