我经常遇到这样一种情况:我们创建了一个对某些枚举起作用的类,但后来我们派生出来,我们希望在不更改基类的情况下为枚举添加更多值。
我从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;
};
答案 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
但是要当心:“过大杀伤是我最大的恐惧...” :)我不会喜欢其中包含枚举以及这样的名称空间的深层次层次结构