看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《Cosmology (宇宙學型男)》之銘言: : 先說是面試題 所以會有一些奇怪的寫法 : 晚輩還是剛入行的新人 若有冒犯 請見諒 : 1. : class A : { : public: : virtual void foo(int a = 0) : { : printf("A %d\n", a); : } : }; : class B : public A : { : public: : virtual void foo(int a = 1) : { : printf("B %d\n", a); : } : }; : A *p = new B(); : p->foo(); : 我答結果是 B 1 : 面試官說你回去試試看 結果回家測試的結果是 B 0 具體的規則我不了解, 不過用 cfront 轉出來的結果如下: ((*(((void (*)(struct A *__0this , int __2a ))(__1p -> __vptr__1A [1]).f))))( ((struct A *)((((char *)__1p ))+ (__1p -> __vptr__1A [1]).d)), 0 ) ; 上面一大串就是在呼叫 B::foo, 看最後的 0 就好, 雖然會呼叫 B::foo, 不過卻把 0 帶入當作是 B::foo 的第二參數, 而不是將 1 帶入。 全部轉出的程式碼貼在這, 歡迎破解, 我花了一些時間勉強看懂。 http://test-template0.blogspot.tw/2018/04/cfront-c-code.html -- 紙上得來終覺淺,絕知此事要躬行。 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 180.204.81.95 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1522753508.A.F4D.html
oiu850714: ..macro magic 04/03 19:19
b0920075: 哇,好噁心哦 04/03 19:30
ilikekotomi: 沒注意過這個規則 感謝分享 04/03 21:06
※ 編輯: descent (180.204.81.95), 04/03/2018 21:09:53