结论
1. c++多态的实现是靠虚函数表来实现的,有虚函数的类有虚函数表,没虚函数的类就没有虚函数表
2. 虚函数表是类的所有对象共用,切记是共同所有,不是一个对象所有
3. 每个虚函数成员占据虚函数表的一行,是个指针,指向该函数的调用地址,所以如果类中有N个虚函数,那么该虚函数表总大小将会是N*4字节(32位),或N*8字节(64位)
4. 有虚函数的类,每个对象的首4个字节(32位)或首8个字节(64位)是一个指针,这个指针指向大家共有的虚函数表
5. 取到指向虚函数表的指针,每次移动一个指针大小即可依次指向不同的虚函数
实验如下图
代码如下
#include <iostream>
using namespace std;
class A
{
public:
A(){}
virtual void func1()
{
cout << "this is func1" <<endl;
}
virtual void func2()
{
cout << "this is func2" << endl;
}
virtual void func3()
{
cout << "this is func3" << endl;
}
};
typedef void(*Fun)(void);
int main()
{
A a;
cout << "对象a的地址=" << *(int*)(&a) << endl;
cout << "指针大小=" << sizeof(int*) <<endl;
Fun fun;
fun = (Fun)*((int*)(*(int*)&a));
fun();
fun = (Fun)*((int*)(*(int*)&a + 8)); // 后移一个指针大小
fun();
fun = (Fun)*((int*)(*(int*)&a + 16)); // 再次后移一个指针大小
fun();
return 0;
}