Re: [问题] 两题C++面试题的询问

楼主: descent (“雄辩是银,沉默是金”)   2018-04-03 19:05:01
※ 引述《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
作者: oiu850714 (oiu)   2018-04-03 19:19:00
..macro magic
作者: b0920075 (Void)   2018-04-03 19:30:00
哇,好恶心哦
作者: ilikekotomi (Young)   2018-04-03 21:06:00
没注意过这个规则 感谢分享

Links booklink

Contact Us: admin [ a t ] ucptt.com