vptr相关内容

替代的虚函数调用实现?

C ++支持通过虚拟机制进行动态绑定.但是据我了解,虚拟机制是编译器的实现细节,而该标准仅指定了在特定情况下应发生的行为.大多数编译器通过虚拟表和虚拟指针来实现虚拟机制.这与虚拟指针和表的实现细节无关.我的问题是: 除了虚拟指针和虚拟表机制之外,是否有任何编译器以其他方式实现虚拟函数的动态分配?据我所知(通过阅读G ++,Microsoft Visual Studio),大多数人都是通过虚拟 ..
发布时间:2020-07-26 06:20:33 C/C++开发

为什么即使不涉及虚拟功能,虚拟继承也需要vtable?

我阅读了以下问题: C ++虚拟类继承对象大小问题,并且想知道为什么虚拟继承会在类中导致附加的vtable指针. 我在这里找到了一篇文章: https://en.wikipedia.org/wiki/Virtual_inheritance 告诉我们: 但是,通常只能在运行时知道此偏移量,... 我在这里不了解与运行时相关的内容.完整的类继承层次结构在编译时就已为人所知.我了 ..
发布时间:2020-06-30 20:22:58 C/C++开发

输入特征以识别主要基类

如果我有一个至少具有一个虚函数的Base类,以及一个单独继承自此的Derived类,则即使It Derived不是标准布局,也可以通过Itanium ABI确保(uintptr_t)derived - (uintptr_t)static_cast(derived)为零.但是,在一般情况下,这不一定是正确的(例如,多重继承). 是否可以编写一个可用于检测一个类是否是另一个类的主要 ..
发布时间:2020-06-30 20:17:32 C/C++开发

虚拟功能表指针在对象中的位置

据我了解,virtual函数指针表在对象中的位置取决于编译器. 将指针放在对象的开头还是结尾是否有任何利弊?反之亦然? 解决方案 虚拟函数表的存在仅依赖于编译器(但是所有编译器都依赖),并且也不要求位置...在所有编译器中我知道细节,vptr存储在对象的开头.原因是它提供了统一的位置.考虑一个类层次结构: struct base { T data; virtual vo ..
发布时间:2020-05-20 01:12:15 C/C++开发

为什么我的C ++对象丢失了VPTr

在调试程序的核心转储之一时,我遇到了一个场景,即它包含的多态对象丢失了VPTr,并且可以看到它指向NULL. 当对象丢失其VPTr时会发生什么情况. 预先感谢, Brijesh 解决方案 内存已被清除,即某些东西覆盖了内存. 您通过调用delete或直接调用析构函数销毁了它.通常,这不会使vptr变为NULL,最终只会使其指向基类的vtable,但这取决于您的实现. ..
发布时间:2020-04-23 11:20:20 服务器开发

实现vptr的替代方案?

这个问题不是关于C ++语言本身(即不是关于标准),而是关于如何调用编译器来实现虚拟函数的替代方案。 用于实现虚拟函数的一般方案是使用指向指针表的指针。 class Base { private: int m; public: virtual metha(); }; 等效地说,C将是 struct Base { void(** vtable) ..
发布时间:2016-10-27 01:26:46 C/C++开发

什么时候vptr(指向vtable)得到初始化为多态类?

这不是关于“当VTABLE创建时?”。相反,当VPTR应该被初始化?是在构造函数的开始/结束还是在构造函数之前/之后? A :: A():i 0),j(0)→>这里 ? { - >>这里 ? // ... - >>这里 ? } 解决方案 虚拟通话通常是v表,但不需要)在构建基本子对象之前和构建成员之前在 ctor-initializer 期间设置。 [ ..
发布时间:2016-10-23 20:06:20 C/C++开发

类(使用单/多继承)的对象有多少个vptr?

对于clas(child)具有单继承的对象通常需要多少个vptr,其中多个继承base1和base2的基类。什么是确定一个对象有多少vptr提供它有几个单继承和多重继承的策略。虽然标准没有指定关于vptrs,但我只是想知道一个实现如何实现虚函数。 解决方案 您为什么关心?简单的答案是够,但我想你想要更完整的东西。 这不是标准的一部分,所以任何实现是免费的但是一般的经验法则是,在使用虚 ..
发布时间:2016-10-23 12:38:16 C/C++开发

虚拟表和虚拟指针用于多个虚拟继承和类型转换

我对于vptr和内存中对象的表示感到困惑,希望你能帮助我更好地理解这件事。 考虑 B 继承 A ,并定义虚函数 f code>。从我学到的内存中类B的对象的表示形式如下: [vptr | A | B] 和 vtbl 表示 vptr $ c> B :: f()。我还理解,将对象从 B 转换为 A 除了忽略 / code>部分在对象的结尾。是真的吗?这种行为不是错误吗?我们希望类型 A 的对象 ..
发布时间:2016-10-22 18:42:30 C/C++开发

理解vptr中的多重继承?

我试图理解书中有效的c ++中的语句。以下是多重继承的继承图。 / p> 现在这本书说vptr需要每个类中有独立的内存。它也使下面的语句 上图中的奇怪是,只有三个vptr,即使涉及四个类。实现可以自由地生成四个vptr,如果他们喜欢,但三个足够(原来是B和D可以共享一个vptr),大多数实现利用这个机会减少编译器生成的开销。 p> 我看不到任何理由为什么在vptr的每个类中 ..
发布时间:2016-10-22 17:43:06 C/C++开发

C ++程序中的虚拟表和虚拟指针数

假设我们有以下程序: class A {public: virtual fun ){}; }; class B:public A {public: virtual fun(){}; }; int main() { A a1; B b1; } 我的问题是多少 vtables 解决方案 div> 它严重依赖于实现,但通常你会得到 ..
发布时间:2016-10-17 09:22:30 C/C++开发

为什么vptr不是静态的?

每个包含一个或多个虚函数的类都有一个与它相关的V表。一个名为vptr的void指针指向该vtable。该类的每个对象都包含指向同一个Vtable的vptr。那么为什么vptr不是静态的呢?而不是将vptr与对象关联,为什么不将它与类关联? 解决方案 对象的运行时类是对象本身的属性。实际上, vptr 表示运行时类,因此不能是 static 。但是,它指向的是同一个运行时类的所有实例可以共享 ..
发布时间:2016-10-17 09:16:07 C/C++开发

虚拟分派实现详细信息

首先,我想澄清一下,我明白在C ++标准中没有vtables和vptrs的概念。 然而,我认为几乎所有的实现实现虚拟调度机制以几乎相同的方式(纠正我,如果我错了,但这不是主要的问题)。此外,我相信我知道虚拟函数如何工作,也就是说,我总是可以告诉调用哪个函数,我只需要实现细节。 假设有人问我以下内容: “您的基类B具有虚函数v1,v2,v3和派生类D:B,它覆盖函数v1和v3并添加虚函数 ..
发布时间:2016-10-13 10:56:12 C/C++开发