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

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

43得票3回答
虚函数调用的实现细节

首先,我想明确一点,我知道C++标准中没有虚函数表和虚函数指针的概念。然而,我认为几乎所有的实现都以非常相似的方式实现了虚函数调用机制(如果我错了,请纠正我,但这不是主要问题)。此外,我相信我知道虚函数如何工作,也就是说,我可以总是知道哪个函数将被调用,我只需要实现细节。 假设有人问我以下问...

20得票5回答
多重继承中理解vptr?

我正在尝试理解书中关于Effective C++中的一句话。以下是多重继承的继承图。 现在这本书说每个类都需要单独的内存来存储vptr。此外,它还作出了以下声明: 上面的图表中的奇怪之处在于,即使涉及四个类,也只有三个vptrs。实现可以自由生成四个vptrs(如果他们愿意),但是三个足够...

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

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

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

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

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

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

13得票6回答
C++程序中的虚拟表数量和虚拟指针

假设我们有以下程序:class A { public: virtual fun(){}; }; class B:public A { public: virtual fun(){}; }; int main() { A a1; B b1...

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

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

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

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

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

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