在C ++中重载结构

时间:2012-04-27 16:40:47

标签: c++ inheritance overloading

我想创建一个非常通用的纯虚拟类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是什么吗?

3 个答案:

答案 0 :(得分: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; }
 };

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

答案 1 :(得分:2)

没有

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

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

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

我建议你阅读Liskov Substitution Principle。当您使用继承设计类层次结构时,它将会非常有用。

答案 2 :(得分: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);