为什么这段代码会调用错误的虚函数?它在偏移量8处调用一个,而它应该在偏移量4处调用一个。如果我在8处重命名该函数它正确地调用4处的那个。代码生成错误?我错过了一些愚蠢的东西?
来源:
class surface_c
{
public:
virtual ~surface_c() = 0; // 0
virtual bool blit(int) = 0; // 4
virtual bool blit() = 0; // 8
};
int main()
{
surface_c* surface;
surface->blit(0);
return 0;
}
拆卸:
int main()
{
00A11250 push ebp
00A11251 mov ebp,esp
00A11253 sub esp,44h
00A11256 push ebx
00A11257 push esi
00A11258 push edi
surface_c* surface;
surface->blit(0);
00A11259 push 0
00A1125B mov eax,dword ptr [surface]
00A1125E mov edx,dword ptr [eax]
00A11260 mov ecx,dword ptr [surface]
00A11263 mov eax,dword ptr [edx+8]
00A11266 call eax
return 0;
00A11268 xor eax,eax
}
00A1126A pop edi
00A1126B pop esi
00A1126C pop ebx
00A1126D mov esp,ebp
00A1126F pop ebp
00A11270 ret
答案 0 :(得分:2)
int main()
{
surface_c* surface; // surface contains garbage, as it is uninitialzed
surface->blit(0);
return 0;
}
surface必须指向surface_c的一些非抽象子类,例如
surface = new surface_f();
其中surface_f是surface_c的一些非抽象子类,并且继承的纯虚函数必须由具体实现覆盖
答案 1 :(得分:1)
您正在使用未初始化的指针调用该方法。调用方法真的很幸运,程序也不会崩溃。