使用父类c ++中的子方法

时间:2015-08-12 19:41:45

标签: c++ parent

这是这笔交易。想象一下你的下面如下。 将文件加载到我想要的算法层之后 能够应用4种不同的算法。所以Algorithm类有4个孩子,我想做这样的事情:

int main(int argc, char* argv[]) {
    Data *data = new Data();
    Parent *alg = new Parent(data);

    alg->start();

    //and this will call the start methods defined in each child. 
}

孩子们是这样的:

class Child1: public Parent {
public:
   int start();
}

class Child2: public Parent {
public:
   int start();
}
//etc...

我在Parents start()方法中做的是:

int Parent::start() {
    Child1::start();
    Child2::start();
    //etc....
    return 0;
}

但是我得到了一个无法调用会员功能' Child1 :: start()'等等。没有对象。' 这件事能以某种方式完成吗?从父类调用子方法?

2 个答案:

答案 0 :(得分:2)

看看"四人帮" 复合模式:

不应从Parent类派生Child类。 相反,Child和Parent类应该实现相同的接口, 我们称之为IAlgorithm。 此接口应具有纯virtual方法start() ...

这是一个例子(使用C ++ 11 auto和基于范围的for循环):

#include <iostream>
#include <vector>

/* parents and children implement this interface*/
class IAlgorithm {
public:
   virtual int start() = 0;
};

class Parent : public IAlgorithm {
private:
    std::vector<IAlgorithm*> children;

public:
    void addChild(IAlgorithm* child) {
        children.push_back(child);
    }

    int start() {
        std::cout << "parent" << std::endl;
        for (auto child: children)
            child->start();
        return 0;
    }
};

class Child1 : public IAlgorithm {
public:
    int start() {
        std::cout << "child 1" << std::endl;
        return 1;
    }
};

class Child2 : public IAlgorithm {
public:
    int start() {
        std::cout << "child 2" << std::endl;
        return 2;
    }
};

class Child3 : public IAlgorithm {
public:
    int start() {
        std::cout << "child 3" << std::endl;
        return 3;
    }
};

int main()
{
   Parent parent;
   Child1 child_1;
   Child2 child_2;
   Child3 child_3;

   parent.addChild(&child_1);
   parent.addChild(&child_2);
   parent.addChild(&child_3);

   parent.start();

   return 0;
}

输出:

parent
child1
child2
child3

答案 1 :(得分:0)

父母一般不能调用子方法。在这种情况下,您已经将类创建为父类型,因此在子项中调用某些内容会非常危险,因为子项可能会假定存在不在父项中的成员方法或变量。

相关问题