2

例如:

基类头文件有:

enum FOO
{
FOO_A,
FOO_B,
FOO_C,
FOO_USERSTART
};

那么派生类有:

enum FOO
{
FOO_USERA=FOO_USERSTART
FOO_USERB,
FOO_USERC
};

只是为了清楚我的用法,它是用于拥有一个事件处理程序,其中基类具有事件,然后派生类可以添加事件。派生类事件处理程序将检查它的事件,如果事件不是它的,那么它会将事件传递给基类。

class Base
{
public:
    virtual void HandleFoo(FOO event);
};

class Derived: public Base
{
public:
    void HandleFoo(FOO event);
};


void Base::HandleFoo(FOO event)
{
     switch(event)
     {
     case FOO_A:
       /* do stuff */
     break;
     case FOO_B:
       /* do stuff */
     break;
     case FOO_B:
       /* do stuff */
     break;
     }
 }

void Derived::HandleFoo(FOO event)
{
     switch(event)
     {
     case FOO_USERA:
       /* do stuff */
     break;
     case FOO_USERB:
       /* do stuff */
     break;
     case FOO_USERB:
       /* do stuff */
     break;
     default:
          /* not my event, must be for someone else */
          Base::HandleFoo(event);
     break;
     }
 }
4

3 回答 3

2

是的,只要枚举都是一个类的成员。如果不是,那么它们将属于同一类型,编译器会非常不高兴。

于 2008-11-06T01:23:09.167 回答
2

不,编译器需要能够在看到 } 后决定枚举是否适合 char、short、int 或 long。

所以如果基类头有

enum Foo {
  A,
  B,
  MAX = 1<<15
};

编译器可能会决定枚举适合 16 位。然后它可以使用它,例如在布置基类时。如果您稍后能够将 1<<31 添加到枚举中,则基类枚举成员将无法保存枚举值之一。

于 2008-11-06T10:46:02.447 回答
0

是的,这行得通。为了稍微简化您的代码,我建议使用这种更常见的“扩展”枚举方法:

enum FOO // Base class's FOO
{
FOO_A,
FOO_B,
FOO_C,
FOO_BASE_MAX // Always keep this as the last value in the base class
};

enum FOO // Derived class's FOO
{
FOO_USERA=FOO_BASE_MAX+1, // Always keep this as the first value in the derived class
FOO_USERB,
FOO_USERC
};

您仍然需要注意“乱序”枚举。(例如:FOO_A=15、FOO_B=11 等)

于 2008-11-06T19:33:21.727 回答