struct base {
virtual void foo() {};
};
struct derived : public base {
void foo() { base:foo(); }
};
int main() {
base* b = new derived();
b->foo();
virtual void foo() {};
};
struct derived : public base {
void foo() { base:foo(); }
};
int main() {
base* b = new derived();
b->foo();
delete b;
}
问题大致知道出在哪儿,但是base:foo()是什么用法啊?
解决方案
20
struct derived : public base { void foo() { printf("--\n"); base:foo(); } };
找到原因了,这是一个递归掉用,报的错是栈溢出
base:foo(); 这个语法等价到this.foo();
base::foo()是直接call 父类的foo()
base:foo() 将会以this为参数,通过虚表查找到 foo再call
base:foo(); 0111154A mov eax,dword ptr [this] 0111154D mov edx,dword ptr [eax] 0111154F mov esi,esp 01111551 mov ecx,dword ptr [this] 01111554 mov eax,dword ptr [edx] 01111556 call eax //这个是是计算后的偏移地址 01111558 cmp esi,esp 0111155A call __RTC_CheckEsp (01111163h) base::foo(); 0111155F mov ecx,dword ptr [this] 01111562 call base::foo (01111050h)
//直接是 父类的函数地址入口