问题标签 [vptr]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 何时为多态类初始化 vptr(指向 vtable)?
这不是关于“何时创建 VTABLE?” . 相反,什么时候应该初始化 VPTR?它是在构造函数的开头/结尾还是构造函数之前/之后?
c++ - C++ 派生的多态类 - 它是否包含 Base 的整个实例,包括 vptr?
说我们有
因此,假设内存中类的大小是其成员的总和(即忽略填充或实际可能发生的任何事情),B 实例的大小是多少?是 sizeof(A) + sizeof(int) + sizeof(vptr) 吗?还是 B 实例在其个人 A 实例中不包含 A vptr,因此 sizeof(b) 将是 sizeof(int) + sizeof(int) + sizeof(vptr)?
c++ - vptr的解析
我知道编译器在类中提供了一个成员调用 VPTR,该类在运行时由构造函数使用确切的 VTABLE 进行初始化。我有 2 个问题
1) 哪个类持有 VPTR。或者所有班级都有单独的 VPTR。
2) 执行语句时der d;
,如何在运行时解析 VPTR?
c++ - vptr 在销毁过程中会发生变化吗?
我在看这篇文章,它说“在进入基类析构函数时,对象变成基类对象,C++ 的所有部分——虚函数、dynamic_casts 等——都以这种方式对待它。” 这是否意味着 vptr 在销毁过程中发生了变化?这是怎么发生的?
c++ - 什么时候为对象设置了虚拟表指针(在 C++ 中)?
我知道对于任何具有虚函数的类或从具有虚函数的类派生的类,编译器会做两件事。首先,它为该类创建一个虚拟表,其次,它将一个虚拟指针 (vptr) 放在对象的基础部分。在运行时,这个 vptr 被分配并在对象被实例化时开始指向正确的 vtable。
我的问题是,在实例化过程中,这个 vptr 到底是在哪里设置的?vptr 的这种分配是否发生在构造函数之前/之后的对象的构造函数内部?
c++ - 在运行时动态更改虚拟指针
因此,假设我有两个类继承了一个具有纯虚函数的基类。这两个类都实现了它们自己版本的该函数,但不添加额外的成员变量,因此它们具有相同的大小。现在有时,在程序执行过程中,我想将一个类转换为另一个类而不复制其所有数据。所以基本上我想让它使用其他类的虚拟表。有没有一种便携的方式来做到这一点?
c++ - 引用变量和继承
以下代码:
产生以下结果:
(在VS2010上编译)
我猜 vptr 不会因分配而改变。有没有办法重新创建它(除了使用指向 Parent 的指针并使用 new 分配给它)?
谢谢
c++ - 当程序集中的运算符 delete() 删除 vptr 指针时?
调用 operator delete() 时 vptr 被删除。
但是 vptr 指针是隐藏的,我们不必关心它的内存结构(而且每个编译器都有不同的系统来说明它是如何工作的。)
我想知道我刚刚制作的对象中的 vptr 何时在程序集中被删除。
这是来自 VS2010 的汇编代码(void operator delete(void * pUserData) )
提前致谢。:)
c++ - C++ 程序中的虚拟表和虚拟指针的数量
假设我们有以下程序:
我的问题是,当我们运行这个程序时,将创建多少个vtables
和多少个?vptrs
c++ - 基类中的虚拟继承和空vtable
有这个代码:
我已经读过,当某个类被虚拟继承时,会为 Derived 类创建空 vtable,因此内存布局如下:
它是 12 个字节。问题是 -如果没有任何虚拟方法,这个空vtable 的用途是什么?它是如何使用的?