问题标签 [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++ - 虚拟继承中派生类的大小
我得到的输出是:
在上面的代码中,为什么 ClassD 的输出是 16。请清楚地解释一下这个虚拟继承是如何工作的。
java - 在 C++ 中,我们能否向上转换一个数组,然后尝试将另一个子类型放入其中(受 Java ArrayStoreException 启发)?
我试图看看如果我们尝试以类似的方式“破坏”一个对象数组,在 C++ 中会发生什么,我们可以尝试在 Java 中这样做。
在 Java 中,我们可以有一个 Double[] 类型的数组,例如,将其向上转换为 Number[](因为 Double 是 Number 的子类),并尝试将 Number 的另一个子类添加到数组中,例如 Integer。代码会编译,但我们会在运行时得到 ArrayStoreException,因为在运行时会根据数组的实际类型(恰好是 Double)检查 Integer 类型,当然会出现不匹配。代码可能如下所示:
所以我想 - C++ 呢?我们可以尝试执行相同的技巧吗?运行时会发生什么?
这是我尝试过的代码和输出。
输出:
看到创建 A 或 C 然后将其复制到 B 的数组中都会复制数据(并且,正如预期的那样,在 C 的情况下,仅复制属于 A 的数据 - 复制元素后没有内存损坏),但是选择了 B 的方法,意味着 vptr 一定没有被复制。
所以我的问题是:
我猜 vptr 没有在默认赋值运算符中复制。是这样吗?这是我们从 B 调用方法但从 C 对象调用数据的唯一可能原因吗?
我们真的可以想出一个例子来让一些不好的或意想不到的事情发生,一些运行时失败吗?我猜我所说的坏的意思是有一个Bs 数组,但其中有一个 A 或 C 的对象(不是 B 或 B 的子类型),一个对 B 来说是“外星人”的对象?
或者,也许 C++ 语言确实通过其特性的某些组合显式或隐式地保证这不会发生(比如当 Java 显式引发 ArrayStoreException 时)?
升级版:
我实际上是在最后一刻更改了这一行,以强调B方法的运行时选择(不应该这样做,因为方法是虚拟的,所以很明显)。我最初有B* bs = new B[5];
并且输出是相同的。
java - 随着我添加更多接口,C++ 对象的大小会增加……Java 会这样做吗?
我正在做一个小实验,试图在 C++ 中模仿 java 的接口。
我有一个继承自基类“Base”的类“Derived”以及两个接口。我注意到,随着我继承的每个接口,我的 Derived 类的大小都会增加,因为它必须为每个 vptr 添加更多空间。这对我来说似乎非常昂贵,所以我有两个主要问题:
- 有没有更好的方法来模仿 C++ 中的 Java 接口?
- Java 的对象大小会随着每个接口的实现而增加吗?
这是我正在使用的代码:
c++ - Why is the vptr discarded when I copy objects?
Example
The vtable pointer of teachers[0] is zero when compiled with gcc.
Also the vtable pointer of uncle keeps its original value instead of being overwritten.
My questions: Why HAS it be that way?
Is there a CLEAN workaround? Can i go with uncle._vptr=ifather->_vptr
and still be portable? What is the ORDINARY routine to copy an object? Should I even file a bug?
Note: it should copy the whole object platform-independant, because no matter how the identification of the object type is done, since it should always be inside the object's data block!
The article
Why does my C++ object loses its VPTr
didn't help me, that must have a different reason.
c++ - C++ - 在没有构造函数的情况下设置基类 vptr?
我用 C++ 编写了一个内存管理器。细节并不重要,但在设置时它会从堆中分配一个大字节数组,当调用它的分配函数时,它会将一些空闲内存字节清除为 0 并返回指向它们的指针。所以一个使用的例子是:
这很好用,我已经对其进行了彻底的测试,并且完全按预期工作。但是,由于它只是创建了一个“假”指针,因此不会调用对象的构造函数。当我尝试分配一个从另一个继承的类时,这种情况就崩溃了——它的 vptr 永远不会被设置,因为这是在构造函数的开头完成的,并且对程序员是隐藏的。因此,一旦我调用基类函数,程序就会因段错误而崩溃。
有没有办法解决?我可以自己设置吗?
编辑:对于其他正在寻找方法的人,请搜索“新位置”。阅读评论以获取更多信息。
c++ - 虚函数机制实现
首先:我在某处读到虚函数的机制是未定义的。即这意味着每个编译器都可以以不同的方式实现它。但是,我发现的每一篇关于虚函数机制的文章都在谈论 VTBL 和 VPTR。
还有其他虚函数机制实现吗?你能举一些例子吗?
第二:不同语言的VTBL实现有什么区别?
c++ - 在这个例子中将创建多少个 vtable 和 vpointer?
这是vtables上的程序。我对 vtables 和 v-pointers 的理解是否正确。
在我看来,将有两个 vtable,只有一个 vptr。我说得对吗?
c++ - 理解使用 vptr 直接调用虚函数时的输出
我正在查看从某个地方获得的代码,以了解 vptr 和 vtable 的工作原理。以下是带有输出的代码
看起来还可以,但是调用派生类的虚函数的方式不明白。不应该是这样吗:
这意味着是使用派生类的 vptr 访问的虚函数的地址,它最终指向派生类的 vtable。
c++ - 具有默认构造函数的 Vptr 与显式声明的构造函数
编译器将代码插入初始化 VPTR 的构造函数的开头。此操作是否受构造函数是默认构造函数还是显式声明的影响?两者有什么区别吗?