基础枚举类的inheritance

有没有一种模式,我可以inheritance枚举从另一枚枚举在C ++?

类似的东西:

enum eBase { one=1, two, three }; enum eDerived: public Base { four=4, five, six }; 

不可能。 有枚举没有inheritance。

您可以改为使用带有命名常量int的类。

例:

 class Colors { public: static const int RED = 1; static const int GREEN = 2; }; class RGB : public Colors { static const int BLUE = 10; }; class FourColors : public Colors { public: static const int ORANGE = 100; static const int PURPLE = 101; }; 
 #include <iostream> #include <ostream> class Enum { public: enum { One = 1, Two, Last }; }; class EnumDeriv : public Enum { public: enum { Three = Enum::Last, Four, Five }; }; int main() { std::cout << EnumDeriv::One << std::endl; std::cout << EnumDeriv::Four << std::endl; return 0; } 

你不能直接这样做,但你可以尝试从这篇文章中使用解决scheme。

主要的想法是使用保存枚举值并具有types转换运算符的助手模板类。 考虑到枚举的基本types是int您可以在代码中无缝使用此持有者类而不是枚举。

不幸的是,在C ++ 14中是不可能的。 我希望我们在C ++ 17中会有这样的语言function。 由于您的问题已经得到了一些解决方法,我不会提供解决scheme。

我想指出的是,措辞应该是“延伸”而不是“inheritance”。 扩展允许更多的值(因为你在例子中从3跳到6),而inheritance意味着给给定的基类增加更多的约束,所以这组可能性缩小。 因此,潜在的铸造与inheritance完全相反。 您可以将派生类强制转换为基类,而不是inheritance类。 但是,当有扩展时,你应该能够把基类扩展到它的扩展而不是副词。 我说的是“应该”,因为正如我所说的,这样的语言特征依然不存在。

这个怎么样? 确定为每个可能的值创build一个实例,但除此之外它非常灵活。 有什么缺点吗?

。H:

 class BaseEnum { public: static const BaseEnum ONE; static const BaseEnum TWO; bool operator==(const BaseEnum& other); protected: BaseEnum() : i(maxI++) {} const int i; static int maxI; }; class DerivedEnum : public BaseEnum { public: static const DerivedEnum THREE; }; 

的.cpp:

 int BaseEnum::maxI = 0; bool BaseEnum::operator==(const BaseEnum& other) { return i == other.i; } const BaseEnum BaseEnum::ONE; const BaseEnum BaseEnum::TWO; const DerivedEnum DerivedEnum::THREE; 

用法:

 BaseEnum e = DerivedEnum::THREE; if (e == DerivedEnum::THREE) { std::cerr << "equal" << std::endl; } 

正如bayda ,enum不会(也不应该)具有function,所以我采取了以下方法来解决你的困境:适应Mykola Golubyev的回应:

 typedef struct { enum { ONE = 1, TWO, LAST }; }BaseEnum; typedef struct : public BaseEnum { enum { THREE = BaseEnum::LAST, FOUR, FIVE }; }DerivedEnum; 

那么,如果你要在派生类中定义具有相同名称的enum ,并从基类中最后一个对应enum项开始,那么你几乎会得到你想要的 – inheritance的枚举。 看看这个代码:

 class Base { public: enum ErrorType { GeneralError, NoMemory, FileNotFound, LastItem } } class Inherited: public Base { enum ErrorType { SocketError = Base::LastItem, NotEnoughBandwidth, } } 

不可能。
但是你可以在类中匿名定义枚举,然后在派生类中添加额外的枚举常量。