vtable ptr解析

vtable ptr解析
+ parrary 0x0012fe3c int * *
+ d {...} DerivedA
func2 0x008f1032 BaseA::foo(void) void (void)*
func5 0x008f1032 BaseA::foo(void) void (void)*
func1 0x008f102d DerivedA::goo(void) void (void)*
func3 0x008f1023 BaseA::bar(void) void (void)*
func4 0x008f102d DerivedA::goo(void) void (void)*
func7 0x008f102d DerivedA::goo(void) void (void)*
func6 0x008f1023 BaseA::bar(void) void (void)*
func9 0x008f1023 BaseA::bar(void) void (void)*
func8 0x008f1032 BaseA::foo(void) void (void)*
+ p 0x0012fe3c int * *
解析:
指针的指针
int **p--->  [ vptr1 ]---> func1
                             ---> func2
                             ---> func3 
                  [vptr2] ---> func4
如果不使用指针的指针,第一种方式需要非常多的转换,很难操作
第二种方式  *p 是指向func1的指针,(*p+1)指向func2, (*p+2)指向func3
                p+1指向vptr2
第三种方式:p[0] 第一层解引用,指向vptr1,p[0][0]指向func1
                p[1]指向vptr2,p[1][0]指向func4。


#include <iostream>
class BaseA
{
public:

     virtual  void goo()
    {
        std::cout<<"base goo"<<"\n";
    }

     virtual  void foo()
    {
        std::cout<<"base foo"<<"\n";
    }

     virtual  void bar()
    {
        std::cout<<"base bar"<<"\n";
    }

};


class DerivedA:  public BaseA
{
public:

     virtual  void goo()
    {
        std::cout<<"derive goo"<<"\n";
    }

};


typedef  void  (*FUNC) ( void);


int main()
{
    DerivedA  d;
    std::cout<<" vptr "<<   ( int)(*(( int *)&d))<<"\n";

    FUNC  func1 = (FUNC)(*(( int*)(*(( int *)&d))));

    func1();

    FUNC  func2 = (FUNC)(*(( int*)(*(( int *)&d))+1));

    func2();

    FUNC  func3 = (FUNC)(*(( int*)(*(( int *)&d))+2));

    func3();

     /////////////////////////////////////// //
     int ** p = ( int **)&d;
    
    FUNC  func4 = (FUNC)*(*p);

    FUNC  func5 = (FUNC)*(*p + 1);
    
    FUNC  func6 =  (FUNC)*(*p + 2);

     /////////////////////////////////////// /
     int ** parrary = ( int **)&d;

    FUNC  func7 = (FUNC)parrary[0][0];

    FUNC  func8 = (FUNC)parrary[0][1];

    FUNC  func9 =  (FUNC)parrary[0][2];
     return 0;
}

你可能感兴趣的:(vtable ptr解析)