我有一个类:
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
之前创建一个“填充”,使其与vitamins
的Fruit
匹配。