c++虚函数表

一、概念

1、C++ Virtual Table (虚函数表) 是C++ 实现多态的方式。

2、每一个具有虚函数(使用virtual关键字定义的函数)的类的具体实现,都有一个指向虚函数的指针表。

3、指向虚函数表的指针作为数据成员存在于所有对象中。当调用虚函数时,查找对象的虚函数表指向正确的派生类函数。 虚函数表是由虚函数指针组成的数组

4、静态绑定 & 动态绑定。

  1. 对于类的普通成员函数使用的是静态绑定,发生在编译期
  2. 对于类的虚函数发生在运行期是动态绑定,发生在运行期
  3. 虽然虚函数的调用是在运行期才确定,但是虚函数表的创建是在编译阶段就完成构建

二、简单例子

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;
}

关于Zeno Chen

本人涉及的领域较多,杂而不精 程序设计语言: Perl, Java, PHP, Python; 数据库系统: MySQL,Oracle; 偶尔做做电路板的开发,主攻STM32单片机
此条目发表在C/C++分类目录。将固定链接加入收藏夹。