Abstract Class的变量是否包含跳转指针

时间:2014-11-11 04:31:40

标签: c++

例如:

   class A
   {
    virtual int foo()=0;
    virtual int foo1() = 0;
    virtual int foo2() = 0;
   };

我知道抽象类有vtable但vtable包含任何信息(跳转指向函数的指针)。 我认为它必须是空的或者什么也不做。

因为我不能单独实例化,所以我无法从记忆中检查。

2 个答案:

答案 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