5

联合可以像类和结构一样用作类型(有一些限制)。它可以有成员函数。它可以用作 OOP 构造。

据我了解,联合只是被导入到 C++ 中以保持与 C 的向后兼容性。
在这些年的编程中,我从未像使用类或结构作为 OOP 构造那样使用联合。

Union 是否有任何实际用途作为 OOP 构造(不仅仅是作为数据类型),或者它只是语言的一些残留部分,永远不会有用?


编辑:
该标准绝对允许联合充当 OOP 构造。它允许在联合中使用成员函数。以下代码可以编译和工作,并且符合标准:

union A
{
    int a;
    int k;

    void doSomething(){}

};

int main()
{
    A obj;
    int i = obj.a;
    obj.doSomething();
    return 0;
}

如果不应该充当 OOP 构造,为什么标准允许联合中的成员函数?
请发布带有具体推理的答案,并且请不要发布我不这么认为的答案,没有很好的理由说明为什么?

4

6 回答 6

5

,联合不是面向对象的构造。

OO 最重要的一个特性是多态性,但联合不能参与继承关系(不能是不同类型的基,本身不能有基)或具有虚函数。联合的唯一目的是提供数据类型,而不是对象

于 2012-05-05T16:16:53.963 回答
1

我个人的看法是“不”。

从历史上看,C 允许开发人员对主机系统进行低级访问,以非常灵活的方式访问内存。通过提供一种构造来将相同的内存区域视为不同的数据类型,这种灵活性变得更加容易。

但是很难看出如何将其归类为任何类型的面向对象构造。

于 2012-05-05T15:21:49.357 回答
1

我认为没有

工会与面向对象无关。

C++ 从未说过它只打算支持 OO。C++ 从一开始就支持多种范式(同时:过程式、函数式、生成式、面向对象)

C++ 11 支持“不受限制的联合”,但从 OO 的角度来看,我没有看到任何用法

根据作者,面向对象需要以下问题:

  • 身份
  • 继承/通才
  • 多态性
  • 封装

工会的情况下,第一个问题是有效的。可以识别联合(例如通过其地址)

没有可用于联合的继承概念。

有人可能会争辩说数据是联合中的多态,但这种解释与 oo 认为的多态相去甚远。联合不能有虚函数,如果没有继承,这几乎是无用的。它会破坏内存布局。

联合中有封装。但是,由于限制,我不希望这种情况下有用的应用程序。如果有的话,我会很感激一个链接

有了这组功能,我认为“抽象数据类型”(ADA)是正确的术语。

于 2012-05-05T15:23:52.333 回答
1

这不是一个好的做法,但假设您可以强有力地保证只有一个字段处于活动状态:

class multi_type {
private:
    bool unit_is_float;
    union {
        float float_member;
        int int_member;
    };
public:
    multi_type(bool is_float) : unit_is_float(is_float) {}
    bool isFloat() { return unit_is_float; }
    bool isInt() { return !unit_is_float; }
    float& getFloat() {
        if (!isFloat()) throw std::logic_error("not a float");
        return float_member;
    }
    int& getInt() {
        if (!isInt()) throw std::logic_error("not an int");
        return int_member;
    }
};

格式要简洁,不漂亮。

有效的应用程序可能位于某种解析库中,其中要解析的语言可以具有不同类型的标记,这些标记只能在运行时确定。它是使用 void*s 的替代方法。

于 2012-05-05T15:53:05.503 回答
1

来自微软的帮助

C++ 联合是类类型的有限形式。它可以包含访问说明符(public、protected、private)、成员数据和成员函数,包括构造函数和析构函数。它不能包含虚函数或静态数据成员。它不能用作基类,也不能有基类。工会成员的默认访问权限是公开的。

甚至可以对联合进行模板化(参见例如模板 - 完整指南)。从这个意义上说,联合提供了几乎相同程度封装

尽管有所有这些语法限制,联合确实填补了破坏 C++ 类型系统的一个小漏洞。考虑这些松散的对应关系:

class/struct with virtual functions    <--> dynamic_cast
class/struct without virtual functions <--> static_cast
union                                  <--> reinterpret_cast

多态性就是以安全和受控的方式破坏类型系统。类和结构及时打破了类型系统。使用虚函数,我们可以在运行时打破类型系统;如果没有虚函数,我们可以在编译时完成(尤其是使用模板)。另一方面,联合可以破坏类型系统请注意,多态性和封装齐头并进:任何可能更改的内容都对用户隐藏(通过 vtable、编译时查找或数据重新解释)。

这是否足以将联合标记为 OO 编程风格的一部分,这对我来说似乎是一个品味问题。

于 2012-05-05T19:49:22.100 回答
0

如果您的数据基于上下文具有不同的解释和类型,则作为低级构造,联合将很有用。从这个意义上说,与保留不能同时存在的不同字段相比,它可以帮助您保持对象更小。

这是对 OOP 的有效关注吗?有点,我猜...

--

人们对它们进行的一种黑客攻击是访问具有不同名称的不同字节(典型示例是具有 4 个字节 r、g、b、a 和一个 32 位整数颜色的联合),但这有潜在的危险https://stackoverflow。 com/a/1582389/278842

于 2012-05-05T15:25:16.383 回答