在并集中使用继承

Using inheritance within a union

本文关键字:继承 集中      更新时间:2023-10-16

我想知道是否有人知道在联合中以某种方式使用继承。

在下面的示例中,TestFails并集不会在Base结构中包含a变量,而TestWorks确实有效。

struct Base { int a; };
union TestFails
{
    struct : public Base {};
    int b;
};
union TestWorks
{
    struct  { int a; };
    int b;
};
int main()
{
    TestWorks works;
    works.a = 0;
    TestFails fails;
    fails.a = 0;
    return 0;
}

您可以在此处测试代码:http://ideone.com/dUzpOR

答案是否定的。c++中有很多暗角,但这不是其中之一:)

类和结构具有继承性。工会没有。

完成你正在努力的事情的唯一方法。。。是将你的联合重构为structs(我之所以说structs,只是因为它们有一个默认的公共作用域,所以你不需要将它们声明为公共的)

如果您试图在并集中放置一个结构,则需要添加新结构的额外作用域才能访问其值。

正如AndyG的回答所表明的那样:

union TestFails
{
    struct foo: public Base {};
    foo f;
    int b;
};
TestFails fails;
fails.f.a = 42;
std::cout << fails.f.a << std::endl;

如果您省略了一个名为的变量并创建了一个未命名的作用域,该作用域偶尔会使用名称空间来完成,那么数据就无法从外部访问(这首先是问题所在)

首先,您认为TestWorks有效的假设是错误的。这不是标准的C++唯一扩展-它被称为未命名的匿名结构-当你用迂腐的选项编译时,你会得到:

prog.cc:5:27:错误:ISO C++禁止匿名结构[-Wpedantic]
结构:public Base{};

                       ^

prog.cc:11:22:错误:ISO C++禁止匿名结构[-Wpedantic]
结构{int a;};

要解决您的问题,只需命名这些匿名结构:

union TestFails
{
    struct : public Base {} s;
    //                      ^
    int b;
};
union TestWorks
{
    struct  { int a; } s;
    //                 ^
    int b;
};

不确定它是否有帮助,但这是有效的:

struct Base { int a; };
struct Foo : Base { int b;};
union TestFailsNot {
    Base base;
    Foo foo;
    int b;
};
int main() {
    TestFailsNot failsNot;
    failsNot.foo.a = 0;    
    failsNot.base.a = 3; // maybe not what you want to do, but it works
}