C++ - 好的或坏的做法?

Vir*_*721 2 c++ polymorphism casting introspection object

我正面临着这样的情况:我发现在基类中存储对象的类型(作为枚举)以进一步将指向该基类的指针转换为子类指针(取决于该类型的值).

例如 :

class CToken
{
public:
   token_type_e eType;
};

class COperatorToken : public CToken
{
public:
    // Sub class specific stuff
};

class CLiteralToken : public CToken
{
public:
    // Sub class specific stuff
};
Run Code Online (Sandbox Code Playgroud)

然后

vector<CToken *> aTokens;

//...

for( size_t nI = 0, nMaxI = aTokens.size(); nI < nMaxI; ++nI )
{
   switch( aTokens[ nI ]->eType )
   {
   case E_OPERATOR :
      // Do something with sub-class specific stuff.
      break;
   case E_LITERAL :
      // Do something with sub-class specific stuff.
      break;
   }
}
Run Code Online (Sandbox Code Playgroud)

这是一种不好的做法吗?

谢谢 :)

编辑:

说我正在分析我的令牌列表.在某些时候,我想要检查当前令牌是否是运营商,正如人们所建议的那样,使用虚拟功能virtual bool isOperator().现在,如果它是一个运算符,我将要访问该子类特定的东西,以找出,例如,它是哪种类型的运算符.在那种情况下,我该怎么办?我无法在我的基类中添加方法getOperatorType(),这是没有意义的.除了转换为子类以检索该子类成员值之外,还有其他方法吗?

Bat*_*eba 8

类型字段确实破坏了C++的面向对象特性.通常你可以用多态来解决这个问题:

CToken定义函数时virtual doSomething(),使用适当的参数和返回类型.

COperatorToken和中实现该功能CLiteralToken.

如果您随后使用,运行时将调用相应的函数 aTokens[ nI ]->doSomething();