抽象类的Do变量包含跳转指针

Does variable of Abstract Class contains jump pointer

本文关键字:指针 包含跳 变量 Do 抽象类      更新时间:2023-10-16

例如:

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

我知道抽象类有vtable,但vtable包含任何信息(跳转到函数的指针)。我认为它一定是无效的,否则就什么都没有了。

因为我不能单独实例化,所以我不能从内存中进行检查。

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的地址,它存储三个相同的地址。

如果某些方法没有body(= 0),则称为纯虚拟函数。

如果类具有纯虚值,则不能实例化该类。

您需要做的是创建一个实现这些方法的子类

   class B : public A
   {
    virtual int foo(){}
    virtual int foo1(){}
    virtual int foo2(){}
   };

编辑:

如果您当时真的想了解vtable的内容,这里有一篇相关的文章