7得票4回答
实现vptr的替代方案是什么?(涉及IT技术)

这个问题与C++语言本身无关(即与标准无关),而是关于如何调用编译器来实现替代方案以实现虚函数。实现虚函数的一般方案是使用指向指针表的指针。 class Base { private: int m; public: virtual meth...

16得票8回答
为什么vptr不是静态的?

每个包含一个或多个虚函数的类都有与之关联的 Vtable。一个名为 vptr 的 void 指针指向该 vtable。该类的每个对象都包含指向相同 Vtable 的 vptr。那么为什么 vptr 不是静态的?为什么不把它与类相关联,而是将其与对象相关联呢?

10得票3回答
多重虚拟继承和类型转换的虚拟表和虚拟指针

我对vptr和内存中对象的表示有点困惑,希望你能帮助我更好地理解这个问题。 考虑类B继承自A,两个类都定义了虚函数f()。根据我的理解,类B的一个对象在内存中的表示形式如下:[ vptr | A | B ],并且vptr所指向的vtbl包含。我也理解将对象从B转换为A除了忽略对象结尾的B部...

49得票11回答
替代的虚函数调用实现?

C++通过虚拟机制支持动态绑定。但据我所知,虚拟机制是编译器的实现细节,标准只规定了特定情况下应该发生的行为。大多数编译器都通过虚拟表和虚拟指针来实现虚拟机制。这不涉及虚拟指针和表的实现细节。我的问题是: 是否有任何编译器以除了虚拟指针和虚拟表机制之外的其他方式实现虚拟函数的动态调度?据我...

10得票2回答
析构函数执行期间vptr是否会改变?

我在看这篇文章,里面说:“当进入基类析构函数时,对象成为一个基类对象,并且C++中的所有部分——虚函数、dynamic_cast等——都会以这种方式处理它。” 这是否意味着在销毁过程中vptr已经改变了?那是如何发生的呢?

19得票7回答
在构造函数中调用虚方法:Java和C++之间的区别

在Java中:class Base { public Base() { System.out.println("Base::Base()"); virt(); } void virt() { System.out.println("Base::virt()"); } } ...

9得票3回答
多态类的vptr(指向虚函数表)何时被初始化?

这不是关于“VTABLE何时创建?”的问题。相反,VPTR应该在什么时候初始化?是在构造函数的开始/结束之前/之后? A::A () : i(0), j(0) -->> here ? { -->> here ? //... -->> here...

17得票1回答
C++/编译:是否可以设置vptr的大小(全局vtable + 2字节索引)?

我最近发布了一个有关C++中虚拟机制导致的内存开销的问题。答案让我明白了虚函数表和虚函数指针是如何工作的。 我的问题是:我在超级计算机上工作,我有数十亿个对象,因此我必须关心由虚拟机制引起的内存开销。经过一些测量,当我使用具有虚函数的类时,每个派生对象都有它的8字节vptr。这绝非微不足道。...

11得票3回答
为什么虚继承即使没有使用虚函数也需要V表?

我看了这个问题:C++虚拟类继承对象大小问题,想知道为什么虚拟继承会导致类中有额外的vtable指针。 我在这里找到一篇文章:https://en.wikipedia.org/wiki/Virtual_inheritance。它告诉我们: 然而,在一般情况下,这个偏移量只有在运行时才...

8得票4回答
当派生类没有覆盖虚函数时,为什么需要vptr?

class base { public: void virtual fn(int i) { cout << "base" << endl; } }; class der : public base{ public: vo...