一、概念
1、C++ Virtual Table (虚函数表) 是C++ 实现多态的方式。
2、每一个具有虚函数(使用virtual关键字定义的函数)的类的具体实现,都有一个指向虚函数的指针表。
3、指向虚函数表的指针是作为数据成员存在于所有对象中。当调用虚函数时,查找对象的虚函数表指向正确的派生类函数。 虚函数表是由虚函数指针组成的数组。
4、静态绑定 & 动态绑定。
- 对于类的普通成员函数使用的是静态绑定,发生在编译期。
- 对于类的虚函数发生在运行期是动态绑定,发生在运行期。
- 虽然虚函数的调用是在运行期才确定,但是虚函数表的创建是在编译阶段就完成构建。
二、简单例子
64位 & 32位 的寻址指针的大小分别是 int64_t & int
/**
*64位机器测试例子
*/
#include <iostream>
class Base {
public:
virtual void a() { std::cout << " a()" << std::endl; }
virtual void b() { std::cout << " b()" << std::endl; }
virtual void c() { std::cout << " c()" << std::endl; }
};
int main()
{
Base base;
( ((void(*)())*((std::int64_t*)(*((std::int64_t*)&base)) + 0)) ) ();
( ((void(*)())*((std::int64_t*)(*((std::int64_t*)&base)) + 1)) ) ();
( ((void(*)())*((std::int64_t*)(*((std::int64_t*)&base)) + 2)) ) ();
return 0;
}
/**
*32位机器测试例子
*/
class Base {
public:
virtual void a() { std::cout << "a()" << std::endl; }
virtual void b() { std::cout << "b()" << std::endl; }
virtual void c() { std::cout << "c()" << std::endl; }
};
int main()
{
Base base;
( ((void(*)())*((int*)(*((int*)&base)) + 0)) ) ();
( ((void(*)())*((int*)(*((int*)&base)) + 1)) ) ();
( ((void(*)())*((int*)(*((int*)&base)) + 2)) ) ();
return 0;
}