在并集中使用继承
Using inheritance within a union
我想知道是否有人知道在联合中以某种方式使用继承。
在下面的示例中,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
}
相关文章:
- 继承函数的重载解析
- 继承期间显示未知行为的子类
- 头文件-继承c++
- 为什么在保护模式下继承升级不起作用
- 通过继承类使用来自不同命名空间的运算符
- 子目录是否继承属性,例如add_definitions,include_directories和父Cmakelist.t
- 混合组合和继承的C++问题
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 如何从存储在std::映射中的std::集中删除元素
- 从类继承时,继承的类是否会通过父类重新定义继承的变量
- 公共与私人继承
- 如何创建从同一类继承的不同对象的向量
- 如何从另一个文件继承私有成员变量和公共函数
- 在模板基类中为继承类中的可选重写生成虚拟方法
- 带有继承的C++工厂
- 我应该避免多重实现继承吗
- C++继承更改成员
- 从具有默认值的部分指定模板类继承时发生SWIG错误,具有不带默认值的正向声明
- 关于C++中具有多重继承"this"指针的说明
- 在并集中使用继承