在派生类'member union

时间:2017-03-09 03:58:19

标签: c++ inheritance unions

假设存在如下基类:

class foo
{
    int x0;//private variable should not be a participant in derived union
           //(unless bar is a friend)
protected:
    int x1;
};

继承它的派生类:

class bar : foo
{
protected:
    union
    {
        //int foo::x1;
        char[4] x2;
    };
};

我想放基础成员x1并在派生类的成员联合中重用它的空间。

通常,派生类可以与基类成员一起使用,除了重用它们的空间外,还可以做任何事情。

问题

  1. 这是否可以使用任何“魔法”并且仍然可以安全地使用UB?
  2. 如果不可能,有什么理由可以认为这可能被认为是严重错误吗?
  3. 是否可以(如果有的话)将其扩展到union中的无名结构以保存基本成员?
  4. 编辑: “魔术”,我并不是指任何特定于供应商的扩展程序。

1 个答案:

答案 0 :(得分:2)

你可以这样做:

class bar : foo
{
protected:
    char* x2() { return reinterpret_cast<char*>(&x1); }
};

这是允许的,因为严格别名对char*有例外。

我认为除此之外你还可以做很多事情(例如,如果你想使用char*以外的类型),除了重新安排类层次结构以将可联合部分与不可联合的部分分开foo