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++ 中的继承和接口的主要内容,如果未能解决你的问题,请参考以下文章

C++ 中的类接口继承

C++中的接口继承

C++ 继承、接口

C++中的多重继承

C++ 中的继承默认访问修饰符

C++多态