OOP 中联合的用法

Usage of Union in OOP

本文关键字:用法 OOP      更新时间:2023-10-16

联合可以像类和结构一样用作类型(有一些限制(。它可以具有成员函数。它可以用作 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 构造,为什么它允许联合中的成员函数?
请发布带有具体推理的答案,请不要发布我不这么认为的答案,没有很好的理由说明原因?

,联合不是 OO 构造。

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

我个人的观点是"否"。

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

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

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

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* 的替代方法。

我认为没有

联合面向对象无关。

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

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

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

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

如果是工会,第一个问题是有效的。可以识别一个工会(例如通过其地址(

工会没有继承的概念。

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

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

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

从Microsoft帮助:

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

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

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

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

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

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

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

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

--

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