struct Foo
{
union {
struct { int a, b; };
int index[2];
};
};
struct Bar : public Foo
{
union {
// Foo members
struct { int barA, barB; };
};
};
int main()
{
Foo f;
Bar b;
// I want it so that
&b.a == &b.barA;
// in the same way that
&f.a == &f.index[0];
}
有什么方法可以使Bar的成员与其父类实现“联盟化”?
非常感谢,非常感谢您的帮助
编辑: 这是所要求的用例:
struct Vec2
{
union {
float index[2];
struct { float x, y; };
};
Vec2(float xVal, float yVal)
: x(xVal), y(yVal)
{
}
~Vec2() {}
Vec2 & add(const Vec2 & b) { /* implimentation */ }
Vec2 & sub(const Vec2 & b) { /* implimentation */ }
};
struct ComplexNumber : public Vec2
{
union {
// Vec2 members
struct { float real, imag; };
};
ComplexNumber(float realPart, float imagPart)
: real(realPart), imag(imagPart)
{
}
ComplexNumber & mul(const ComplexNumber & b) { /* implimentation */ }
ComplexNumber & div(const ComplexNumber & b) { /* implimentation */ }
};
int main()
{
ComplexNumber a(5, 2);
ComplexNumber b(7, 8);
}
我希望不仅能够解决a和b的Vec2成员的问题, 而且还可以使用Vec2中声明的功能,甚至可以添加 ComplexNumbers和Vec2可互换。
答案 0 :(得分:2)
您在abort;
和Foo
中的工会是匿名的。这是一种语法糖,它可以像在封闭类中那样访问其成员:
[class.union.anon] / 1:
出于名称查找的目的,在匿名联合定义之后,认为已在声明匿名联合的范围内定义了匿名联合的成员。
但这仅是成员访问的便利。匿名联合对象未在其封闭类中合并。结果,在Bar
中存在两个不同的联合(对象位于不同的地址)。这些不能被合并/合并。
顺便说一句,该标准明确禁止联盟以任何方式继承:
[class.union] / 3:
工会不得有基层阶级。联合不得用作基类。
没有办法去做你打算做的事情。
根据您的特定情况,您想在派生类中建立的合并联合似乎与基类的各个部分具有一对一的关系。鉴于这些情况,您可以作为解决方法使用一些引用来引用同一成员:
Bar
当然,您需要实施规则3,以避免出现任何问题(例如,在完成复制构造函数或赋值的情况下,指向错误对象的引用)。
现在真正的问题是,复合体是否是Vec2。就个人而言,我宁愿采用更清晰的方法,使复杂的类成为独立类,并拥有Vec2成员。在这种情况下,组合系统将重新定义Vec2操作并将成员函数转发给Vec2成员。