成员函数“指针”的大小
之所以将指针用引号表示,是因为成员函数“指针”不是指针!还是让代码来说话。
#include <iostream> using namespace std; // 父类A class A { public: int funA() { return 2; } }; // 父类B class B { public: int funB() { return 3; } }; // 单继承 class C : public A { public: int funC() { return 4; } }; // 多重继承 class D : public A, public B { public: int funD() { return 5; } }; // 虚继承 class C1 : virtual public A { public: int funC1() { return 41; } }; // 虚继承 class C2 : virtual public B { public: int funC2() { return 42; } }; // 虚继承 class D1 : public C1, public C2 { public: int funD1() { return 51; } }; int main() { /* ** 本人机子环境 XP + VS2008 */ // 这些函数指针大小都没变 cout << sizeof( &main ) << endl; cout << sizeof( &A::funA ) << endl; cout << sizeof( &B::funB ) << endl; cout << sizeof( &C::funC ) << endl; // 多重继承 cout << sizeof( &D::funD ) << endl; // 虚继承 cout << sizeof( &C1::funC1 ) << endl; cout << sizeof( &C2::funC2 ) << endl; cout << sizeof( &D1::funD1 ) << endl; return 0; }
结果是不是挺吃惊的。具体原因呢——这有得说了。简单地说,就是多重继承、虚继承下的this指针偏移引起的。
参考资料
1.http://blog.csdn.net/caiguowu/article/details/6917842
2.http://www.codeproject.com/Articles/7150/Member-Function-Pointers-and-the-Fastest-Possible(这里面可以得到详细的解释)