作者descent (「雄辩是银,沉默是金」)
看板C_and_CPP
标题Re: [问题] 两题C++面试题的询问
时间Tue Apr 3 19:05:01 2018
※ 引述《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://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1522753508.A.F4D.html
1F:推 oiu850714: ..macro magic 04/03 19:19
2F:推 b0920075: 哇,好恶心哦 04/03 19:30
3F:推 ilikekotomi: 没注意过这个规则 感谢分享 04/03 21:06
※ 编辑: descent (180.204.81.95), 04/03/2018 21:09:53