C++ 工会地址上的新职位

C++ 工会地址上的新职位,c++,memory-management,polymorphism,new-operator,C++,Memory Management,Polymorphism,New Operator,我想在课堂上使用新的位置。 为了使缓冲区适合多个不同的类,我创建了一个union成员作为缓冲区。 定义如下的类 class MyBase { public: virtual void vFunc0(){} virtual void vFunc1(){} protected: int memberA; int memberB; }; class SubClassA:public MyBase { virtual void vFunc0()override{}

我想在课堂上使用新的位置。 为了使缓冲区适合多个不同的类,我创建了一个union成员作为缓冲区。 定义如下的类

class MyBase
{
public:
    virtual void vFunc0(){}
    virtual void vFunc1(){}
protected:
    int memberA;
    int memberB;
};
class SubClassA:public MyBase
{
    virtual void vFunc0()override{}
    virtual void vFunc1()override{}
};

class SubClassB:public MyBase
{
    int subMemberB;
};
我定义了一个warp类

class WarpClass
{
public:
    WarpClass( EMySubType subType )
    {
        memset(&m_Buffer,0,sizeof(m_Buffer));
        void* pBuffer = &m_Buffer;
        switch (subType)
        {
        case ESubA:
            ::new (pBuffer) SubClassA();
            break;
        case ESubB:
            ::new (pBuffer) SubClassB();
            break;
        default:
            ::new (pBuffer) MyBase();
            break;
    }
}

private:
    union
    {
        char _b0[sizeof(MyBase)];
        char _b1[sizeof(SubClassA)];
        char _b2[sizeof(SubClassB)];
    }m_Buffer;
};
因为我工作的项目没有memeory Manager,所以我想创建一个静态数组,它可以适合一个系列类和子类,我想用这种方法来扭曲它们


那么这样会不会造成问题呢?或者有没有更好的方法来定义新位置的安全缓冲区?

另外,堆栈溢出不是代码检查的好地方。所以问题应该是具体的技术问题,并有一个客观的答案(而不是“好吧,你可以做X、Y或Z,这取决于你更喜欢什么”)。可能更适合这个问题。std::aligned\U union如何?en.cppreference.com/w/cpp/types/aligned\u union看起来像是在试图重新发明轮子。使用c++14,您可以享受std::variant。它提供了您正在寻找的功能。在较旧的平台上,您可以尝试boost::variant.@Red.Wave variant是17而不是14,这会增加更多内存开销。如果您不需要内存提供的附加功能,那么这并不理想。