例如:
class A
{
virtual int foo()=0;
virtual int foo1() = 0;
virtual int foo2() = 0;
};
我知道抽象类有vtable但vtable包含任何信息(跳转指向函数的指针)。 我认为它必须是空的或者什么也不做。
因为我不能单独实例化,所以我无法从记忆中检查。
答案 0 :(得分:0)
class A
{
public:
virtual void foo()=0;
virtual void foo1() = 0;
virtual void foo2() = 0;
};
class B : public A
{
public:
virtual void foo() { std::cout << "foo"; }
virtual void foo1() { std::cout << "foo1"; }
virtual void foo2() { std::cout << "foo2"; }
};
int main(int argc, char* argv[])
{
B b; //add a breakpoint on this line.
return 0;
}
逐步打开汇编视图和调试
001D153E lea ecx,[b]
001D1541 call B::B (1D113Bh) //step into
B::B
001D15B0 push ebp
001D15B1 mov ebp,esp
001D15B3 sub esp,0CCh
001D15B9 push ebx
001D15BA push esi
001D15BB push edi
001D15BC push ecx
001D15BD lea edi,[ebp-0CCh]
001D15C3 mov ecx,33h
001D15C8 mov eax,0CCCCCCCCh
001D15CD rep stos dword ptr es:[edi]
001D15CF pop ecx
001D15D0 mov dword ptr [ebp-8],ecx
001D15D3 mov ecx,dword ptr [this]
001D15D6 call A::A (1D1140h) //step into
....
A::A
001D1730 push ebp
001D1731 mov ebp,esp
001D1733 sub esp,0CCh
001D1739 push ebx
001D173A push esi
001D173B push edi
001D173C push ecx
001D173D lea edi,[ebp-0CCh]
001D1743 mov ecx,33h
001D1748 mov eax,0CCCCCCCCh
001D174D rep stos dword ptr es:[edi]
001D174F pop ecx
001D1750 mov dword ptr [ebp-8],ecx
001D1753 mov eax,dword ptr [this]
001D1756 mov dword ptr [eax],offset A::`vftable' (1D782Ch)
001D175C mov eax,dword ptr [this]
1D782Ch是A :: vftable的地址,它存储三个相同的地址。
答案 1 :(得分:-1)
如果某些方法没有body(= 0
),则称它们为纯虚函数。
如果一个类具有纯虚拟,则无法实例化。
您需要做的是创建一个实现这些方法的子类
class B : public A
{
virtual int foo(){}
virtual int foo1(){}
virtual int foo2(){}
};
编辑:
如果您真的想知道此时vtable的内容,请参阅related article