我有一个类:
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
,因此它与 Fruit
的 vitamins
匹配。