我有一个类:

class Fruit
{
protected:
    int Vitamins
    [...]
public:
    [...]
}

结构:
struct InTheMatrixFruit
{
  int           vitamins;
  virtual       ~InTheMatrixFruit();
};

和一个引用Fruit的函数:
void function(Fruit &fruit);

在这个函数中,如果我写:
reinterpret_cast<InTheMatrixFruit&>(fruit).vitamins = 300;

它确实改变了维生素的保护值(value)。

但是,如果我这样删除虚拟的:
struct InTheMatrixFruit
    {
      int           vitamins;
      ~InTheMatrixFruit();
    };

它不再起作用了。

为什么它可以在虚拟环境下工作,而不是没有虚拟环境?

我在考虑VTables。

提前致谢 :)

最佳答案

您的Fruit声明可能至少包含一个虚函数。

在虚拟功能的常见实现中,使用虚拟表。指向虚拟表的指针作为第一个元素存储在对象的内存表示中。声明虚拟函数的位置无关紧要,虚拟表始终位于开头。

因此,通过在InTheMatrixFruit中声明一个虚函数,您可以在int vitamins之前创建一个“填充”,使其与vitaminsFruit匹配。

10-05 21:35