我的目标是创建共享一些公共数据的类层次结构的类的实例。我创建(使用联合)足够的内存,以便可以在分配的内存中创建最大的实例。现在我想创建/交换类的实例并在那里使用内存中的“旧”数据。这是有效/合法的操作吗?
原始代码使用一些 MTP 东西来创建联合,目标是使用这个类层次结构作为状态机实现的核心。我在这里只显示包含问题的基本代码。
我看到如果基类不包含虚方法但派生方法包含,这是一个问题。这是因为 vtable 指针位于内存前面(在 x86/linux 上使用 gcc)。
简单的问题:如果基类的实例是之前创建的并且内存与该派生类的实例一起重用,那么派生类的实例能否访问基类的数据?
class Base
{
public:
int a;
Base()=default;
Base( int _a):a(_a){}
void Print() { cout << "Value: " << a << endl; }
};
class Derived1: public Base
{
public:
int d;
Derived1(): d( 0x11223344){}
};
union U
{
U(){}
Base base;
Derived1 derived1;
} u;
int main()
{
memset( &u, 0, sizeof(u));
new (&u) Base(12345678);
u.base.Print();
new (&u) Derived1;
u.base.Print();
}