继承只是为了共享枚举——危险吗?

inheritance just to share enum - dangerous?

每当我想在多个文件中共享一个枚举时,我会:-

大多数情况下,一个枚举会有一个 class。 (1:1)

class B{
    public: enum EnumB{ E1,E2 };  
};
class C : public B{ /* .... access EnumB */}; //a kind of struct
class D : public B{ /* .... access EnumB */}; //a kind of widget/manager

此方法使 CD 无需任何前缀 B 即可访问 EnumB

我认为还可以,因为我在非常狭窄的范围内使用这些枚举。 (2-4 classes)
A SO post 还声明可以将继承用于实用程序。

但是,我不认为这是一种流行的方法:-

  • a SO-qualified way to share enum.

  • Share global enum inside a namespace

问题

  • 我的方法怎么危险?它的缺点是什么?

    在实际情况下,我倾向于多重继承许多 classes 就是为了这个。

    class ShadowEnum{ public: enum ShadowE{ SHADOW,NO_SHADOW};   };
    class ColorEnum{  public: enum ColorE{ RED,BLUE,GREEN,PURPLE } };  
    class LightType{  public: enum LightE{ L_SPHERE, L_CONE, L_SPOT};   };   
    class LightManager : public ShadowEnum, public ColorEnum,public LightType{
         /* some code */
    };
    
  • 这会不会成为未来可怕钻石问题的原因?

顺便说一句,我认为enum-class不在本题范围内。

不是"dangerous"per-se。这只是糟糕的设计。
Class 继承应该定义 IS-A 关系。

从非 "natural" 的东西继承时,您往往会在以后的开发道路上遇到问题。

一些可能影响您的设计含义是:
1.同一个class在更深的继承图中的多重继承
2. 如果您将来更改继承结构,指针转换可能会受到影响(为了方便继承,您不希望发生这种情况)

几个更好的解决方案:
1. 在命名空间中包含枚举 - 使用 #using namespace。在 header 中添加它会传播到任何包含 header.
的编译单元 2. 在 C++11 中你可以只使用 enum classes - 不是在继承中,但它给你更强的类型安全性。