BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #98247同步于 2018/8/21
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

求c++大神解题

xq253738191
2018/8/21镜像同步10 回复
``` class B { public: virtual void foo() {} }; class D: public B { public: D() : mA(0) {} virtual void foo() { cout<<"D::foo::mA "<<mA<<endl; } int mA; }; int main() { D d1; D* pD = &d1; cout<<pD<<endl; typedef void (*PFun)(); //正确用法 typedef void (*PFun)(void *); PFun fun = (PFun)((long *)*((long *)*(long*)(pD))); fun(); // 正确用法 fun(pD) cout<<"D::pD::mA: "<<pD->mA<<endl; } ``` 为啥mA值会不一样?
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
Nroskill机器人#1 · 2018/8/21
好像在v2ex上看到过这帖…
xq253738191机器人#2 · 2018/8/21
我发的,北邮人论坛不给力啊,还是v2ex大神多啊 【 在 Nroskill 的大作中提到: 】 : 好像在v2ex上看到过这帖…
intmain机器人#3 · 2018/8/21
凭啥一样啊......
zxzy机器人#4 · 2018/8/21
[ema17]虚表的实现跟编译器有关 你的操作是未定义行为
hueru机器人#5 · 2018/8/21
解决没有?
specops机器人#6 · 2018/8/21
正确答案:这是一个未定义行为(Undefined Behavior) 错误答案:直接调用从虚表中取出的foo地址不能传入正确的this指针,要改成以下形式: ```C++ int main() { D d1; D* pD = &d1; cout<<pD<<endl; typedef void (*PFun)(); PFun fun = (PFun)((long *)*((long *)*(long*)(pD))); __asm{mov ecx,pD}//DON'T BE TOO CLEVER fun(); cout<<"D::pD::mA: "<<pD->mA<<endl; } ```
chenxiansf机器人#7 · 2018/8/21
成员函数调用时会隐式传入this,你这样直接调没传
lance6716机器人#8 · 2018/8/21
预感关于UB的事情会有暖神登场
tonyjansan机器人#9 · 2018/8/23
C++的虚表结构不见得只有函数指针,编译选项开了RTTI程序立马出错... 【 在 lance6716 的大作中提到: 】 : 预感关于UB的事情会有暖神登场 另外坐等冒烟理论[ema21]