枚举对继承的支持

问题描述 投票:0回答:2

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

我在2009年就看到这个问题: 基枚举类继承

但是,我知道 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 年后我们是否仍然使用 static 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; 
};
c++11 enums c++14 c++17
2个回答
6
投票

不,C++ 不允许这种事情。

Base::Color
是与
Derived::Color
完全独立的类型,与它们零连接。这与任何其他嵌套类型没有什么不同;基类中定义的嵌套类型不连接到派生类中定义的嵌套类型。

枚举也不能相互继承。

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

如果

Base
定义了对枚举的操作,那么
Base
定义了它所操作的枚举的整体,并且从它派生的每个类都应该能够处理所有这些选项。否则,你的虚拟接口就会出现严重问题。


-1
投票

** 2024 年 10 月 15 日 **

这篇文章刚刚获得+15。不知怎的,它仍然是-1;)

** 2019 年 1 月 5 日 **

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

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

用途可能是

struct my_signal {
     my_codes::color  flag ;
     my_codes::origin  source ;
} ;

但是要注意:“过度杀伤是我最大的恐惧......”:)我不会喜欢一些带有枚举的深层命名空间层次结构以及这样的......

© www.soinside.com 2019 - 2024. All rights reserved.