※ 引述《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