当我想创建一个纯虚拟函数并为其分配多种输出格式(如int、double和char)时,我遇到了一个问题。
我写了下面的代码,只有当我删除了我的抽象类时,它才有效,这不是我想要的。
我的代码:
enter code here
//class DynamicArray
//{
// public:
// virtual void GetData(unsigned int s, int& d) = 0;
// virtual void SetData(unsigned int s, int& d) = 0;
//};
class DynamicArrayDouble//: public DynamicArray
{
private:
unsigned int m_Length;
double* arr;
public:
DynamicArrayDouble(unsigned int l)
{
m_Length = l;
arr = new double[m_Length];
}
void SetParam(unsigned int l)
{
m_Length = l;
arr = new double[m_Length];
}
void GetData(unsigned int s, double& d)
{
d = arr[s];
}
void SetData(unsigned int s, double& d)
{
arr[s] = d;
}
};
当我取消注释DynamicArray类并且DynamicArrayDouble继承它时,我会遇到一些错误。需要注意的是,我第一次尝试使用void*作为Set和Get方法的第二个参数,但我再次收到一些错误,我不能像这样使用这种代码样式:错误:无法将变量"d1"声明为抽象类型"DynamicArrayDouble"
上述错误代码为:
class DynamicArray
{
public:
virtual void GetData(unsigned int s, void* d) = 0;
virtual void SetData(unsigned int s, void* d) = 0;
};
class DynamicArrayDouble: public DynamicArray
{
private:
unsigned int m_Length;
double* arr;
public:
DynamicArrayDouble(unsigned int l)
{
m_Length = l;
arr = new double[m_Length];
}
void SetParam(unsigned int l)
{
m_Length = l;
arr = new double[m_Length];
}
void GetData(unsigned int s, double* d)
{
*d = arr[s];
}
void SetData(unsigned int s, double* d)
{
arr[s] = *d;
}
};
int main()
{
DynamicArrayDouble d1(5);
double x=0;
for(unsigned int i=0;i<5;i++)
{
x = ((i+1.0)/2);
d1.SetData(i,&x);
}
for(unsigned int i=0;i<5;i++)
{
d1.GetData(i,&x);
cout << "Data " << i+1 << " is = " << x << endl;
}
return 0;
}
我用代码块写代码。
我会感谢你的回答。。。非常感谢。
您不能简单地覆盖
void func(some_pointer_type ptr);
带有
void func(some_other_pointer_type ptr);
参考文献也是如此。事实上,如果它们不匹配,就被认为是完全无关的。
DynamicArrayDouble
——这个名字告诉我,你应该研究模板,而不是为你需要的所有类型编写相同的代码。STL就是这样工作的。您将完全避免运行时多态性。
对于初学者:
template <typename T>
DynamicArray;