枚举支持继承

时间:2017-03-20 20:32:22

标签: c++11 enums c++14 c++17

我经常遇到这样一种情况:我们创建了一个对某些枚举起作用的类,但后来我们派生出来,我们希望在不更改基类的情况下为枚举添加更多值。

我从2009年开始看到这个问题: Base enum class inheritance

但是,我知道C ++ 11,14,17中的枚举有很多变化。 这些更改是否允许将枚举从基类扩展到派生?

class Base 
{ 
   enum State {STATE_1, STATE_2, STATE_3}; 
};

class Derived : public Base 
{ 
   enum State {STATE_4};
}; 

...我们希望派生的地方有一个枚举来描述它可以在的状态,它们是:STATE_1,STATE_2,STATE_3和STATE_4。我们并不真的想要更改基类中的枚举,因为其他派生类可能无法进入STATE_4。我们也不想创建一个新的枚举,因为我们已经在Base中有一个用于State。

为了在8年后完成这项工作,我们是否仍然使用静态const值?

class Base 
{ 
   static int STATE_1= 0;
   static int STATE_2= 1;
   static int STATE_3= 2; 
};

class Derived : public Base 
{ 
   static int STATE_4= 3; 
};

2 个答案:

答案 0 :(得分:3)

不,C ++不允许这样的事情。 Base::Color是与Derived::Color完全分开的类型,与它们没有任何关联。这与任何其他嵌套类型没有什么不同;基类中定义的嵌套类型未连接到派生类中定义的嵌套类型。

枚举也不能从彼此继承。

无论如何,这种事情往往违背良好的OOP做法。毕竟,如果派生类引入了新的枚举器,基类将如何处理它?不同的派生类实例如何处理它?<​​/ p>

如果Base定义了对枚举的操作,那么Base定义它所操作的枚举的总数,并且从它派生的每个类都应该能够处理所有这些选项。否则,您的虚拟界面会出现问题。

答案 1 :(得分:1)

为什么不仅仅使用命名空间对枚举进行分组?

I1

用法可能是

namespace my_codes {
   enum class color { red, green, blue } ;
   enum class origin { server, client } ;
} // my_codes

但是要当心:“过大杀伤是我最大的恐惧...” :)我不会喜欢其中包含枚举以及这样的名称空间的深层次层次结构