3

多年来,我一直在兜圈子,试图在 C++ 中正确实现继承,而 Google 并没有真正提供帮助。我有工作 Java 代码,我正在移植到严重依赖接口的 C++。

我正在为一些遗传算法编写一个测试平台,所以我需要通用变量,允许该类的任何类型与它们相关联,允许执行相同的功能,而不管具体类型如何。例如,我需要一个“交叉”类型,它允许将任何类型的交叉存储在变量中,并允许对其执行相同的交叉方法集。

我用纯虚函数“performCrossover”创建了一个接口。然后由通用“交叉”类继承,然后由各个交叉类型继承。

目前,链接器抱怨我正在重新定义“problem::performCrossover”,但这正是我所需要的。我可以通过在通用交叉类中使函数纯虚拟来解决这个问题,但是我无法实例化它,这又正是我所需要的。

我也尝试过更改它“crossovername::performCrossover”,但后来我得到“不允许继承的成员”。这就是我现在的位置。

我的界面:

class crossoverinterface {
public:
    virtual genome** performCrossover(genome* firstParent, genome* secondParent) = 0;
};

我需要能够用任何类型的交叉实例化的通用交叉类型。

class crossover: public crossoverinterface{ 
public:
    crossover() {};
    crossover(int genomeLength, int nObjectives);
    ~crossover();

    genome** preCrossover(genome* firstParent, genome* secondParent);
    virtual genome** performCrossover(genome* firstParent, genome* secondParent);

private:
    genome** solution;
    int genomeLength;
    int nObjectives;
};

子类 1 的示例:

class simulatedbinarycrossover: public crossover {
public:
    simulatedbinarycrossover(int genomeLength, int nObjectives, double lowerBound, double upperBound);
};

genome** simulatedbinarycrossover::performCrossover(genome* firstParent, genome* secondParent){
    ...code...
}

最后是错误:“performCrossover”:成员函数未在 'simulatedbinarycrossover' 中声明” Intellisense 将其称为“不允许继承的成员”。

希望我说得有道理,尝试和描述这是一个非常棘手的问题。

欢迎所有建议。

4

1 回答 1

7

您必须在实例化它的每个类定义中编写方法原型。

在基类中定义的事实performCrossover并不意味着您不必在派生类中再次定义它。

class simulatedbinarycrossover: public crossover {
public:
    simulatedbinarycrossover(int genomeLength, int nObjectives, double lowerBound, double upperBound);

    genome** performCrossover(genome* firstParent, genome* secondParent) ;
};


genome** simulatedbinarycrossover::performCrossover(genome* firstParent, genome* secondParent){
    ...code...
}
于 2012-10-23T13:46:31.650 回答