我正在尝试定义一个名为“Algorithm”的接口,它有一个纯虚方法insertData(InputData * input)。
接口的实现称为“Algorithm1”,我想使用“SpecificData”作为参数“SpecificData”来实现方法“insertData”,它是“InputData”类的子节点。
没有类型铸造是否可能?
显然,使用这段代码,我从编译器得到一个错误,即虚函数“insertData”在“Algorithm1”中是纯粹的。
class Algorithm{
public:
virtual ~Algorithm();
virtual void insertData(InputData* input) = 0;
};
class Algorithm1 : public Algorithm{
public:
Algorithm1();
virtual ~Algorithm1();
void insertData(SpecificData* input){
input.getID();
input.getAdditionalNumbers;
/*Process input information etc.*/ };
};
class InputData{
public:
void setID(int id){ this->id = id; }
int getID(){ return id;};
private:
int id;
};
class SpecifiData : public InputData{
public:
list<int> getAdditionalNumbers(){/*Return various Numbers*/};
private:
list<int> extraInfo;
};
void main(){
SpecificData* data = new SpecificData();
Algorithm* alg = new Algorithm1();
alg->insertData(data);
}
答案 0 :(得分:1)
要使insertData
成为相同的函数(而不是“隐藏”原始insertData
,您需要两个函数具有相同的参数(和相同的返回类型)。
使用虚函数的接口的整体思想是“它们从外部看起来是相同的”。您应该能够构建对象列表,并使用相同的输入数据对列表中的所有对象执行相同的操作。
如果你打破这个原则,你就是“做错了”。
答案 1 :(得分:0)
不,这没有意义。
考虑以下场景 - 您有一个Algorithm*
类型对象的容器(vector / set w / e)和一个以此容器和InputData* in
作为输入的函数,然后迭代它们并调用insertData(in)
在容器中的每个对象上,这当然应该可以正常工作,但是如果容器中的一个对象是Algorithm1类型,那么会发生什么呢?
答案 2 :(得分:0)
我认为,这是&#34;工厂方法&#34;的典型例子。在设计模式术语中。
class Algorithm
{
public:
virtual ~Algorithm();
virtual void insertData(InputData* input) = 0;
};
class InputData
{
public:
void setID(int id){ this->id = id; }
int getID(){ return id;};
virtual list<int> getAdditionalNumbers() = 0;
private:
int id;
};
class Algorithm1 : public Algorithm
{
public:
Algorithm1();
virtual ~Algorithm1();
void insertData(InputData* input){
input.getID();
input.getAdditionalNumbers;
/*Process input information etc.*/ };
};
class SpecifiData : public InputData
{
public:
// implementation
virtual list<int> getAdditionalNumbers(){/*Return various Numbers*/};
private:
list<int> extraInfo;
};
void main()
{
InputData* data = new SpecificData();
Algorithm* alg = new Algorithm1();
alg->insertData(data);
}