您的位置:首页 > 健康 > 养生 > c++ 虚函数表

c++ 虚函数表

2024/10/6 2:27:21 来源:https://blog.csdn.net/youth0532/article/details/139952645  浏览:    关键词:c++ 虚函数表

        在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

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com