【问题标题】:Include inherited base class member in derived class' member union在派生类的成员联合中包含继承的基类成员
【发布时间】:2017-03-09 03:58:18
【问题描述】:

假设存在如下基类:

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. 是否有可能(如果有的话)将其扩展到联合内的无名结构以保存基成员?

编辑:“魔法”并不是指任何供应商特定的扩展。

【问题讨论】:

    标签: c++ inheritance unions


    【解决方案1】:

    你可以这样做:

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

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

    我认为除此之外您无能为力(例如,如果您想使用 char* 以外的类型),除了重新排列类层次结构以将可联合的部分与 @987654324 的不可联合的部分分开@。

    【讨论】:

    • 嗯,这取决于以char[4] 为例是否只是巧合。还有... 16 位整数。 =P
    • 我希望 wchar_t 也能做到这一点,就像 wchar_t[2] x2 一样。虽然我的整数是 32 位的
    • @AnirbanSarkar:你能不能把它改成基类中的char[4],然后在派生类中重新解释为intwchar_t[2]等?
    • @JohnZwinck 好吧,能够在联合中做到这一点的全部意义在于简化代码,而无需求助于memcpyreinterpret_cast 之类的东西。我有一个解决方案,只是它不是那么优雅。
    • @AnirbanSarkar:说到避免它的原因,你知道x1不需要关注x0吗?当两个变量之间有一个访问说明符(在这种情况下为protected)时,关于成员排序的常规规则不再适用。
    猜你喜欢
    • 1970-01-01
    • 2018-11-30
    • 1970-01-01
    • 2017-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多