枚举支持继承
Enums support for inheritance
我经常遇到这样的情况,我们创建了一个作用于某些枚举的 class,但后来我们推导并且我们想在不改变基础 class 的情况下向枚举添加更多值。
我在 2009 年看到这个问题:
Base enum class inheritance
但是,我知道 C++11、14、17 中的枚举有很多变化。
这些更改是否允许将枚举从基础 class 扩展到派生?
class Base
{
enum State {STATE_1, STATE_2, STATE_3};
};
class Derived : public Base
{
enum State {STATE_4};
};
...我们希望 derived 有一个枚举来描述它可能处于的状态,它们是:STATE_1、STATE_2、STATE_3 和 STATE_4.我们真的不想更改基 class 中的枚举,因为其他派生的 classes 可能没有能力在 STATE_4 中。我们也不想创建一个新的枚举,因为我们已经在 Base 中为 State 创建了一个枚举。
为了在 8 年后实现这一目标,我们是否仍然使用静态常量值来代替?
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++ 不允许这种事情。 Base::Color
是与 Derived::Color
完全不同的类型,与它们的联系为零。这与任何其他嵌套类型没有什么不同;基 class 中定义的嵌套类型未连接到派生 class.
中定义的嵌套类型
枚举也不能相互继承。
无论如何,这类事情往往会违背良好的 OOP 实践。毕竟,如果派生 class 引入了一个新的枚举器,那么基 class 将如何处理它?不同的派生 class 实例将如何处理它?
如果 Base
定义了一个枚举的操作,那么 Base
定义了它所操作的枚举的整体,并且从它派生的每个 class 应该能够处理所有这些选项。否则,您的虚拟界面有问题。
为什么不直接使用命名空间来对枚举进行分组?
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 ;
} ;
但要注意:"overkill is my biggest fear..." :) 我不会喜欢其中包含枚举的命名空间的深层层次结构等等......
我经常遇到这样的情况,我们创建了一个作用于某些枚举的 class,但后来我们推导并且我们想在不改变基础 class 的情况下向枚举添加更多值。
我在 2009 年看到这个问题: Base enum class inheritance
但是,我知道 C++11、14、17 中的枚举有很多变化。 这些更改是否允许将枚举从基础 class 扩展到派生?
class Base
{
enum State {STATE_1, STATE_2, STATE_3};
};
class Derived : public Base
{
enum State {STATE_4};
};
...我们希望 derived 有一个枚举来描述它可能处于的状态,它们是:STATE_1、STATE_2、STATE_3 和 STATE_4.我们真的不想更改基 class 中的枚举,因为其他派生的 classes 可能没有能力在 STATE_4 中。我们也不想创建一个新的枚举,因为我们已经在 Base 中为 State 创建了一个枚举。
为了在 8 年后实现这一目标,我们是否仍然使用静态常量值来代替?
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++ 不允许这种事情。 Base::Color
是与 Derived::Color
完全不同的类型,与它们的联系为零。这与任何其他嵌套类型没有什么不同;基 class 中定义的嵌套类型未连接到派生 class.
枚举也不能相互继承。
无论如何,这类事情往往会违背良好的 OOP 实践。毕竟,如果派生 class 引入了一个新的枚举器,那么基 class 将如何处理它?不同的派生 class 实例将如何处理它?
如果 Base
定义了一个枚举的操作,那么 Base
定义了它所操作的枚举的整体,并且从它派生的每个 class 应该能够处理所有这些选项。否则,您的虚拟界面有问题。
为什么不直接使用命名空间来对枚举进行分组?
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 ;
} ;
但要注意:"overkill is my biggest fear..." :) 我不会喜欢其中包含枚举的命名空间的深层层次结构等等......