继承只是为了分享枚举 - 危险吗?

时间:2017-03-12 06:42:07

标签: c++ c++11 enums multiple-inheritance

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

  • 创建一个类,例如B致力于枚举
  • 一个想要轻松访问枚举的类,将派生自B

大多数情况下,一个枚举会有一个类。 (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访问EnumB ,不带任何前缀 B

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

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

问题

  • 我的做法如何危险?它的缺点是什么?

    在实际情况中,我倾向于多次继承许多类。

    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不属于这个问题的范围。

1 个答案:

答案 0 :(得分:3)

不是"危险"每本身。这只是糟糕的设计 类继承应该定义一个IS-A关系。

当继承自然而非自然的东西时,你往往会在发展道路上遇到问题。

可能影响您的一些设计含义是:
1.更深层继承图中同一类的多重继承 2.如果您将来更改继承结构,可能会影响指针强制转换(这是您不希望仅仅为了方便继承而发生的事情)

一些更好的解决方案:
1.在命名空间中包含枚举 - 使用#using namespace。在标头中添加它将传播到包含该标头的任何编译单元 2.在C ++ 11中,您可以使用enum classes - 不在继承中,但它可以提供更强的类型安全性。