我想知道是否有人知道是否有可能以某种方式在联盟中使用继承.
在下面的示例中,TestFails联合将不包含Base结构中的变量,而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中有很多黑暗的角落,但这不是他们中的一个:)
类和结构具有继承性.工会没有.
完成你正在尝试的唯一方法是将你的工会重构为结构(我说结构只是因为它们有一个默认的公共范围,所以你不需要将它们公开)
如果您尝试在联合中放置一个结构,则需要添加新结构的额外范围以访问其值.
正如AndyG的答案显示的那样:
union TestFails { struct foo: public Base {}; foo f; int b; }; TestFails fails; fails.f.a = 42; std::cout << fails.f.a << std::endl;
如果省略一个名为的变量并创建一个偶尔使用命名空间的未命名范围,则无法从外部访问数据(这首先是这一点)