函数指针与虚方法分析与实践
需要具备的基础知识:
- 32位编译器中任意类型指针均占4字节,64位编译器任意类型指针均占8字节。
- 当我们创建一个对象时,仅为其成员变量空间。
_vptr(虚方法表ptr):
我们创建的每个类对象,类中提供的所有虚方法均存储在一张虚方法表中。而对象仅保存着一个指向虚方法表的指针。
我们通过一个简单的例子来验证这个观点:
代码演示:
#include<iostream>
using namespace std;
class Test{
public:
virtual void a(){
cout << "a" << endl;
}
virtual void b(){
cout << "b" << endl;
}
virtual void c(){
cout << "c" << endl;
}
virtual void d(){
cout << "d" << endl;
}
};
int main() {
Test t;
cout << sizeof(t) << endl;
return 0;
}
///output: 8
程序运行结果:8,充分说明单个对象存储虚方法只存储一个指向虚函数表的指针对象。
一般来说,虚方法指针存放到对象对象的首部,有的编译器则存放在尾部。
我们不妨可以直接通过指针访问对象的虚方法,对应刚才我给的图解很好理解。步骤如下。
#include<iostream>
using namespace std;
class Test{
public:
virtual void a(){
cout << "a" << endl;
}
virtual void b(){
cout << "b" << endl;
}
};
int main() {
Test t;
typedef void (*FUNC)();
long long* pt = (long long *)(*(long long *)(&t));
FUNC a = (FUNC)pt[0];
FUNC b = (FUNC)pt[1];
a();
b();
return 0;
}