使用其他基类的子类的抽象类方法实现

时间:2013-06-10 12:42:52

标签: c++

我正在尝试定义一个名为“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);
}

3 个答案:

答案 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);
    }