c++ - 继承只是为了共享枚举 - 危险吗?

标签 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 */
    };
    
  • 这会成为 future 可怕菱形继承(钻石问题)的原因吗?

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

最佳答案

它本身并不“危险”。这只是糟糕的设计。
类继承应该定义 IS-A 关系。

当继承不“自然”的东西时,您往往会在以后的开发过程中遇到问题。

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

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

关于c++ - 继承只是为了共享枚举 - 危险吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42744566/

相关文章:

javascript - JavaScript 中的枚举标志

c++ - 拥有指向保留 vector 元素的指针是否合法?

c++ - 如何使用自动工具将测试单元添加到共享库项目

c++ - 延长线到屏幕边缘

c++ - 如何使用右值在 C++11 中复制或别名对象?

c++ - 右值引用 : Why aren't rvalues implicitly moved?

c++ - 在cuda中声明共享内存的大小

c++ - 为什么在用花括号初始化结构时会出错?

C++ Enum in struct error for definition

java - 为什么不从 Enum<E extends Enum<E>> 扩展