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