返回信息流```
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值会不一样?
这是一条镜像帖。来源:北邮人论坛 / cpp / #98247同步于 2018/8/21
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
求c++大神解题
xq253738191
2018/8/21镜像同步10 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
正确答案:这是一个未定义行为(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;
}
```
C++的虚表结构不见得只有函数指针,编译选项开了RTTI程序立马出错...
【 在 lance6716 的大作中提到: 】
: 预感关于UB的事情会有暖神登场
另外坐等冒烟理论[ema21]