使用来自父类的子方法

  • 本文关键字:子方法 父类 c++ parent
  • 更新时间 :
  • 英文 :


事情是这样的。想象一下下面的场景。将文件加载到我想要的算法层后能够应用4种不同的算法。算法类有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()'等。没有对象。这件事有办法解决吗?从父类调用子方法?

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

子类不应该从父类派生。相反,子类和父类应该实现相同的接口,我们叫它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

父类通常不能调用子类方法。在本例中,您已经将类创建为父类型,因此在子类型中调用某些东西是相当危险的,因为子类型可能会假定存在父类型中没有的成员方法或变量。

最新更新