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