C++ 中的继承和接口
Posted
技术标签:
【中文标题】C++ 中的继承和接口【英文标题】:Inheritance and Interfaces in C++ 【发布时间】:2012-10-23 13:44:43 【问题描述】:多年来,我一直在兜圈子,试图在 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' : member function not declared in 'simulatedbinarycrossover'”Intellisense 称之为“不允许继承的成员”。
希望我说得有道理,这是一个很难描述的问题。
欢迎所有建议。
【问题讨论】:
我的建议是创建一个基于良好 c++ 标准的良好 api,而不是尝试使用永远不适合 c++ 世界的大锤复制 java api。 当你看到一个函数返回一个指向指针的指针时,它确实会敲响警钟,即基因组**。 我很欣赏你的意思。我与其他一些博士生共用一个实验室,他们也推荐相同的实验室,但我不确定从哪里开始说实话。 在 C++ 中,您可以从template<class genome> void performCrossover(...
开始处理各种基因组的函数。在 C++ 中,您也不必必须 使每个函数都成为类的成员,并且您的接口也不必必须 只包含纯虚函数。这只是一种不同的语言!
【参考方案1】:
您必须在实例化它的每个类定义中编写方法原型。
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...
【讨论】:
感谢您的建议,确实可以解决问题。但是我遇到的新问题是它抱怨“虚拟基因组** performCrossover(基因组* firstParent,基因组* secondParent);”在交叉类中是一个未解析的外部符号。我认为这无关紧要,因为它已被子类覆盖? 不,所有的虚函数都必须定义,无处不在。编译器不知道你只会使用派生类。 在交叉类中,我创建了我认为是默认的“存根”函数,并消除了错误。再次感谢大家的意见。以上是关于C++ 中的继承和接口的主要内容,如果未能解决你的问题,请参考以下文章