随笔 - 21  文章 - 0  trackbacks - 0
<2014年7月>
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789

常用链接

留言簿

随笔分类

随笔档案

文章分类

搜索

  •  

最新评论

阅读排行榜

评论排行榜

+ 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;
}
posted on 2014-07-10 10:51 pizzx 阅读(678) 评论(0)  编辑 收藏 引用 所属分类: c++/boost

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理