C++,Union vs Class Inheritance

Sim*_*low 5 c++ inheritance class unions

我有一个问题,我被困在哪种方法比另一方更好:

具有枚举的结构,用于定义union成员中的数据或具有继承的一组类

示例代码如下:

基于联盟的结构

  typedef union TokenValue{
   bool bValue;
   long lvalue;
   double dvalue;
   std::string svalue;
   }

  class Token{
  public:
   TokenType type;
   TokenValue value;
   };
Run Code Online (Sandbox Code Playgroud)

类继承

class TokenBase{
public:
  TokenType type;
  };



class TokenNumber: public TokenBase{
public:
bool isInt;
long lvalue;
double dvalue;
};

class TokenString: public TokenBase{
 public:
  std::string svalue;
 };
Run Code Online (Sandbox Code Playgroud)

Jos*_*ley 6

这种类型的设计被称为有区别的联合或标记联合。您可以在 Google 上搜索“C++ 可区分联合”以查看此类设计的几个示例和方法。

union对于 C++,AC通常被认为有点低级和不安全。正如皮特贝克尔所说union基于您的解决方案应该提供访问器,而不是直接暴露不安全的union成员。 unions 还有一个缺点,在 C++11 之前,它们不能包含非 POD 数据结构(所以没有std::string)。

基于继承的解决方案的优点是您可以开始使用多态(例如,添加虚拟PrintTo方法)。(当然,您可以通过向执行overPrintTounion基于解决方案添加方法来实现类似的结果,但这不是面向对象的。)switchTokenType

一个union基础的解决方案可能会体重轻于基于继承的解决方案(无vtable)。对于像词法分析器标记这样低级的东西,这可能更可取。

如果允许使用第三方库,我强烈建议您查看Boost.Variant以获取更多 C++ 方法来区分联合。