通过结构修改保护值



我有一个类:

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

结构:

struct InTheMatrixFruit
{
  int           vitamins;
  virtual       ~InTheMatrixFruit();
};

和一个在水果上引用的功能:

void function(Fruit &fruit);

在此功能中,如果我写:

reinterpret_cast<InTheMatrixFruit&>(fruit).vitamins = 300;

它确实修改了维生素受保护的值。

但是,如果我删除这样的虚拟:

struct InTheMatrixFruit
    {
      int           vitamins;
      ~InTheMatrixFruit();
    };

它不再起作用。

为什么它可以使用虚拟而不是没有?

我正在考虑Vtables。

预先感谢:)

,因为类实例的大小会更改,并且随着 vitamins成员的偏移。这是BeaCuse virtual功能将导致在分配给成员的内存之前将VTable指针存储在实例中。

。 。

当心!reinterpret_cast可以杀死您的小猫!

您对Fruit的声明可能至少包含虚拟函数。

在虚拟函数的常见实现中,使用了虚拟表。指向虚拟表的指针作为对象的内存表示中的 first 元素存储。在何处声明虚拟函数,虚拟表总是开始的。

因此,通过在InTheMatrixFruit中声明虚拟函数,您可以在之前创建一个"填充" int vitamins,因此它与 Fruitvitamins匹配。

最新更新