首先,我最近从 Julia 跳到了 C++,所以我对其中一些概念还很陌生,如果我没有使用正确的术语,我很抱歉。我正在 C++ 中实现元启发式算法,并且我正在尝试提出一个每个社区都必须实现的抽象类。每个邻域都有自己的参数,这些参数对应于他们将尝试更改/更新的解向量的索引,有些仅使用 1 个参数,有些使用多个参数,并且每个邻域都有自己的评估方法,该方法返回提示的损失/增益通过参数的更改以及执行更改的 move 方法。
这就是我的想法,但我不确定如何完成它,以及我是否走在正确的轨道上。我应该使用模板吗?如果需要,如何使用?谢谢!
class Neighborhood
{
public:
class NeighborhoodArgs
{
};
virtual void move(NeighborhoodArgs args);
virtual double evaluate(NeighborhoodArgs args);
private:
Data& data;
Parameters& parameters;
};
#include "Neighborhood.h"
class TwoOptNeighborhood : Neighborhood
{
public:
class TwoOptArgs : NeighborhoodArgs
{
int pos1;
int pos2;
};
void move(TwoOptArgs args) override;
double evaluate(TwoOptArgs args) override;
};
这很奇怪。
首先,你不能那样
override
—— 签名需要相同,并且 TwoOptArgs
与 NeighborhoodArgs
不同:你可以将 NeighborhoodArgs
传递给你的基类函数,但不能到派生的。
但问题是,既然你有完全不相关的函数,为什么还要使用继承和虚函数呢?除了名称之外,
TwoOptNeighborhood
中的函数完全不同。
如果您有一个
Neighborhood
(可以是某个派生类),但您不知道或不关心它在幕后是什么,则虚拟函数非常有用。这正是您在这里不做的事情,因为您期望基于实际类的不同函数参数。