在C++中,虚函数表 virtual table 是用于实现动态多样性的一种机制。当一个类包含虚函数时,编译器会创建一个虚函数表,并为该类的每个对象增加一个指向此虚函数的指针 (虚函数指针 vptr)。
以下是生成虚函数表的一些关键点:
1. **编译时生成**:当编译器遇到一个类定义中包含至少一个虚函数时,它会为该类生成一个虚函数表。这个表是一个函数指针的数组,每个数组元素存储了一个虚函数的地址。
2. **类层次结构**:如果一个类是从基类继承而来,并且基类有虚函数,那么派生类会继承基类的虚函数表,并可能在其基础上扩展,加入派生类自己新增的虚函数。
3. **虚函数表的位置**:虚函数表通常存储在程序的只读数据段(如`.rodata`或`.rdata`),这意味着它是全局的,对于同一个类的所有对象共享同一份虚函数表。
4. **虚函数指针**:每个含有虚函数的类的对象实例中都会有一个隐藏的指针,称为虚函数指针(vptr)。这个指针通常在对象的内存布局的开始位置,但这也取决于具体的编译器实现。这个指针在对象构造时被初始化,指向该对象所属类的虚函数表。
5. **多态行为**:当通过基类指针或引用调用一个虚函数时,编译器生成的代码实际上会通过对象的vptr找到正确的虚函数表,然后根据虚函数在表中的偏移来调用实际的函数,这也就是多态行为的基础。
总结来说,虚函数表的生成是在编译阶段完成的,它使得C++能够支持运行时的动态多态性。
对于不包括虚函数的c++类,是没有这个指针的。
class BaseCls {
};class BaseCls1{
public:virtual ~BaseCls1() {}
};BaseCls cls1;
BaseCls1 cls2;
std::cout << sizeof(cls1) << std::endl; // 1
std::cout << sizeof(cls2) << std::endl; // 8