c++ - 什么时候为对象设置虚拟表指针(在 C++ 中)?

标签 c++ constructor virtual-functions vtable vptr

我知道对于任何具有虚函数的类或从具有虚函数的类派生的类,编译器会做两件事。首先,它为该类创建一个虚拟表,其次,它在对象的基础部分放置一个虚拟指针 (vptr)。在运行时,当对象被实例化时,这个 vptr 被分配并开始指向正确的 vtable。

我的问题是这个 vptr 在实例化过程中的确切位置设置?这个 vptr 的赋值是否发生在构造函数之前/之后的对象的构造函数内部?

最佳答案

这完全取决于实现。

对于大多数编译器,

编译器在每个构造函数的成员初始化器列表中初始化 this->__vptr。

想法是使每个对象的 v 指针指向其类的 v 表,编译器为此生成隐藏代码并将其添加到构造函数代码中。像这样的东西:

Base::Base(...arbitrary params...)
   : __vptr(&Base::__vtable[0])  ← supplied by the compiler, hidden from the programmer
 {

 }

This C++ 常见问题解答解释了究竟发生了什么的要点。

关于c++ - 什么时候为对象设置虚拟表指针(在 C++ 中)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7934540/

相关文章:

c++ - 枚举大小 *在实践中*

c# - 温习 C++、C#、ASP.NET 和设计模式的知识

c++ - 显示正交的 OpenGL 投影矩阵

c# - C# 中的动态构造函数

java - 在 Java 中如何使用没有 'new' 的构造函数?

c++ - 多态性如何涉及多重继承?

java - 求Android Java AES Encryption , NDK C/C++ Decryption and viceversa源码例子

C++;是否可以在子构造函数中间调用父构造函数?

c++ - std::tuple 到成员函数

c++ - 如何调用作为函数输入参数的基类虚函数