0

我正在尝试定义一个名为“算法”的接口,它有一个纯虚拟方法 insertData(InputData* 输入)。

该接口的实现称为“Algorithm1”,我想使用作为“InputData”类的子级“SpecificData”的参数“insertData”来实现方法“insertData”。

没有类型转换可以吗?

显然,使用这段代码,我从编译器得到一个错误,即虚函数“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);
}
4

3 回答 3

1

为了insertData成为同一个函数(而不是“隐藏”原始insertData函数,您需要两个函数具有相同的参数(和相同的返回类型)。

使用虚函数的接口的整个想法是“它们从外部看起来是一样的”。您应该能够构建对象列表,并对列表中的所有对象使用相同的输入数据执行相同的操作。

如果你违反了这个原则,你就是“做错了”。

于 2013-06-10T12:54:43.837 回答
0

不,这没有意义。考虑以下场景 - 您有一个Algorithm*类型为对象的容器(vector/set w/e)和一个将这个容器和 aInputData* in作为输入的函数,然后迭代它们并调用insertData(in)容器中的每个对象,这个当然应该可以正常工作,但是如果容器中的对象之一是 Algorithm1 类型,那么会发生什么?

于 2013-06-10T12:51:58.787 回答
0

我认为,这是设计模式术语中“工厂方法”的典型示例。

 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);
    }
于 2013-06-10T13:01:16.970 回答