Chr*_*isz 3 enums c++11 c++14 c++17
我经常遇到这样的情况:我们创建了一个作用于某些枚举的类,但后来我们派生并希望在不更改基类的情况下向枚举添加更多值。
我从 2009 年看到这个问题: Base enum class继承
但是,我知道 C++11、14、17 中对枚举进行了许多更改。这些更改中的任何一个是否允许将枚举从基类扩展到派生类?
class Base
{
enum State {STATE_1, STATE_2, STATE_3};
};
class Derived : public Base
{
enum State {STATE_4};
};
Run Code Online (Sandbox Code Playgroud)
...我们希望派生有一个枚举来描述它可以处于的状态,即:STATE_1、STATE_2、STATE_3 和 STATE_4。我们真的不想更改基类中的枚举,因为其他派生类可能无法处于 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;
};
Run Code Online (Sandbox Code Playgroud)
不,C++ 不允许这种事情。Base::Color是完全独立的类型Derived::Color,与它们零连接。这与任何其他嵌套类型没有什么不同;基类中定义的嵌套类型不连接到派生类中定义的嵌套类型。
枚举也不能相互继承。
无论如何,这类事情往往与良好的 OOP 实践背道而驰。毕竟,如果派生类引入了一个新的枚举器,基类将如何处理它?不同的派生类实例将如何处理它?
如果Base定义对枚举的操作,则Base定义它所操作的枚举的整体,并且从它派生的每个类都应该能够处理所有这些选项。否则,您的虚拟接口就会出现问题。
| 归档时间: |
|
| 查看次数: |
4731 次 |
| 最近记录: |