首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

请解释通过基类成员函数指针调用函数的机制解决方法

2012-04-13 
请解释通过基类成员函数指针调用函数的机制代码和运行结果如下,请详细解释一下原因以及编译器是怎么处理成

请解释通过基类成员函数指针调用函数的机制
代码和运行结果如下,请详细解释一下原因以及编译器是怎么处理成员函数指针的。谢谢。

class   Base
{
public:
        void   func()   {   printf( "Enter   Base::func()\n ");   }
        virtual   void   virtual_func()   {   printf( "Enter   Base::virtual_func()\n ");   }
};

class   Derived   :   public   Base
{
public:
        void   func()   {   printf( "Enter   Derived::func()\n ");   }
        virtual   void   virtual_func()   {   printf( "Enter   Derived::virtual_func()\n ");   }
};

typedef   void   (Base::*p_base_func)();

int   main()
{
        Derived   d;
        Base   *pb   =   &d;

        p_base_func   pbf   =   &Base::func;
        printf( "--   Call   via   pointer   to   normal   function   of   base\n ");
        (pb-> *pbf)();
        (d.*pbf)();
       
        pbf   =   &Base::virtual_func;
        printf( "--   Call   via   pointer   to   virtual   function   of   base\n ");
        (pb-> *pbf)();
        (d.*pbf)();
       
        return   0;
}

运行结果:
--   Call   via   pointer   to   normal   function   of   base
Enter   Base::func()
Enter   Base::func()
--   Call   via   pointer   to   virtual   function   of   base
Enter   Derived::virtual_func()
Enter   Derived::virtual_func()


[解决办法]
指向成员函数的指针并非指针 不过给定对象之后可以当指针那样用
(pb-> *pbf)();
和 pb-> func();等

d.*pbf)();和d.func();等价
你把这两个东西替换后就好看程序了

这题考的是多态性性的动态联编
也就是一个基类的指针调用的成员函数, 如果成员函数是虚函数的话, 实际调用的是派生类的成员函数

[解决办法]
楼主可以看看这个:
http://vcer.net/1000000000366.html

如果想明白的彻底一些,
建议好好看看 inside C++ object model 这本书。
[解决办法]
它是根据指向成员函数指针的值特点来判断。

例如当指针的值很小的时候就认为是偏移,即虚函数取地址得到的,如果值很大就认为是普通成员函数的地址得到的。

当然具体怎么判断可以各有各的做法。
[解决办法]
楼主还是找本《深度探索C++对象模型》吧,一看便知。
不过,知道了对写代码也没啥实际帮助,基本属于纯满足好奇心,所以建议不要在这类话题上浪费时间。
[解决办法]
后四字节是修订this指针用的。

热点排行