1

我想创建一个非常通用的纯虚拟类 i_BIS_Data 将由唯一的 BIS_Data 类继承。

class i_BIS_Data
{
public:

i_BIS_Data(void) { }
virtual ~i_BIS_Data( void ) { }

  virtual void setData(bis_data data) = 0;
};

我希望 i_BIS_Data 的所有孩子都定义 bis_data 结构,因为它们都会有所不同。我希望我的子类看起来类似于以下内容:

class BIS_0192_Aircraft_ID_Data : i_BIS_Data
{
  public:

  struct bis_data
  {
   UInt16  acid; 
   UInt16  parity; 
  };

  void setData(bis_data data){   m_data.parity = data.parity; 
                             m_data.acid   = data.acid; }
}

当我尝试编译使用 BIS_0192_Aircraft_ID_Data 的类时,我收到以下错误:错误 C2061:语法错误:标识符“bis_data”。我相信这是因为我没有在父类中定义 bis_data 。

那么是否可以“重载”结构并允许多个子类定义 bis_data 是什么?

4

3 回答 3

3
 template<typename BIS_DATA_T>
 class i_BIS_Data
 {
      typedef BIS_DATA_T bis_data;
      ...
      virtual void setData(bis_data data) = 0;
 };

 struct bis_0192_data
 {
    UInt16  acid; 
    UInt16  parity; 
 };

 class BIS_0192_Aircraft_ID_Data : public i_BIS_Data<bis_0192_data>
 {
   public:
   void setData(bis_data data){   m_data.parity = data.parity; 
                         m_data.acid   = data.acid; }
 };

这应该可以,但是i_BIS_Data<XX>XX 的不同类型的子类是不兼容的。

于 2012-04-27T16:51:00.643 回答
2

不。

在 OOP 理论中,函数重载的参数可以是逆变的,返回类型可以是协变的。

在 C++ 中,允许协变返回类型,但参数类型是不变的。

您要求的是参数类型的协方差,这在理论上是错误的,并且在 C++ 中也是不允许的。

我建议您阅读有关 Liskov 替换原则的内容。当您设计具有继承的类层次结构时,它将非常有帮助。

于 2012-04-27T16:44:16.030 回答
1
class i_BIS_Data
{
  public:

  i_BIS_Data(void) { }
  virtual ~i_BIS_Data( void ) { }

  virtual void setData(void* data) = 0;
};


class BIS_0192_Aircraft_ID_Data : i_BIS_Data
{
  public:

  struct bis_data
  {
   UInt16  acid; 
   UInt16  parity; 
  };

  bis_data m_data;

  void setData(void* data)
  {   
      m_data = *(bis_data*)data;
      // m_data.parity = data.parity; 
      // m_data.acid   = data.acid; 
  }
};

例子:

BIS_0192_Aircraft_ID_Data::bis_data data;

data.acid = 7;
data.parity = 8;

BIS_0192_Aircraft_ID_Data c;

c.setData((void*)&data);
于 2012-04-27T17:05:06.010 回答