读书人

请解释通过基类成员函数指针调用函数的

发布时间: 2012-04-13 13:50:24 作者: rapoo

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

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指针用的。

读书人网 >C++

热点推荐