如何在父类中创建一个抽象类,以便每个子类都可以有自己的实现?

问题描述 投票:0回答:1

首先,我最近从 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;
};
c++ oop templates mathematical-optimization heuristics
1个回答
0
投票

这很奇怪。

首先,你不能那样

override
—— 签名需要相同,并且
TwoOptArgs
NeighborhoodArgs
不同:你可以将
NeighborhoodArgs
传递给你的基类函数,但不能到派生的。

但问题是,既然你有完全不相关的函数,为什么还要使用继承和虚函数呢?除了名称之外,

TwoOptNeighborhood
中的函数完全不同。

如果您有一个

Neighborhood
(可以是某个派生类),但您不知道或不关心它在幕后是什么,则虚拟函数非常有用。这正是您在这里不做的事情,因为您期望基于实际类的不同函数参数。

© www.soinside.com 2019 - 2024. All rights reserved.