如何在派生 class 中正确覆盖具有不同参数的函数?

How to properly override function with different arguments in derived class?

我正在我的大学为 c++ 类 制作一个简单的 MVC 示例。首先看代码: executor.h部分:

    class IExecutor {
    IParams params;
public:
    virtual void initialize(IParams iParams);
    virtual void execute();
};

class QEExec : public IExecutor {
public:
    void initialize(QEParams iParams) override;
    void execute() override;
};

现在 params.h 部分:

class IParams {

};

class QEParams : public IParams {
public:
    int a;
    int b;
    int c;
};

问题是我想为 QEExec 创建 void initialize(QEParams iParams) 函数并将 QEParams 传递给它以便访问 a、b 和 c 参数(我'稍后会需要它)但我不能这样做,因为 virtual void initialize(IParams)。我认为如果 QEParams 派生自 IParams 我将能够这样做,但我无法访问我之前提到的参数。如何让它工作,以便我能够在初始化函数中访问 a、b 和 c 参数? 编辑:我会放一张它应该是什么样子的照片: https://i.stack.imgur.com/KWaSQ.jpg

听起来你没有正确使用 OOP。

因为 QEExec 是一个 IExecutor (它继承),它可以 initialize 就像 IExecutor 一样,理想情况下,这两个初始化都将对其 IParams 对象做类似的事情。如果是这样,那么应该作用于 abc 的应该是 QEParams,而不是 QEExec

您可以使用多态性来做到这一点:

class IParams {
    virtual void init_logic() { }
};

class QEParams : public IParams {
public:
    void init_logic() { /* Do something with a/b/c */ }
private:
    int a;
    int b;
    int c;
};

然后...

class IExecutor {
    IParams params;
public:
    virtual void initialize(IParams *iParams);
    virtual void execute();
};

class QEExec : public IExecutor {
public:
    //Will call the QEParams init_logic when passed a QEParams pointer
    void initialize(IParams *iParams) { iParams->init_logic(); }
    void execute() override;
};
  1. 接口没有任何字段
  2. 接口只有纯虚方法
  3. 姓名 initialize of IExecutor 表示有些误解。看起来它应该在施工期间的乞讨中被调用一次。它应该隐藏在某些工厂创建对象实现 IExecutor
  4. 的步骤中

所以基本上我怀疑你需要更多这样的东西:

class IExecutor
{
public:
    virutal ~IExecutor() {}
    virtual void execute() = 0;
};

struct QEParams {
    int a;
    int b;
    int c;
};

class QEExec: public IExecutor
{
public:
    QEExec(int b, int c) ....

    void initialie(); // second step init

    void execute() override;
};

class CAExec: public SomeOtherBaseClass, public IExecutor
{
public:
    CAExec(int a, int c) ....

    void execute() override;
};

std::unique_ptr<IExecutor> executorFactory(const QEParams& params)
{
    if (params.a < 0) {
        auto result = std::make_unique<QEExec>(params.b, params.c);
        result->initialie();
        return result;
    }
    return std::make_unique<CAExec>(params.a, params.c);
}

通常工厂参数是结构数据,额外的抽象已经过时。

如果需要不同类型的参数来创建 IExecutor 的替代版本,您只需提供不同的工厂函数(可能重载):

std::unique_ptr<IExecutor> executorFactory(const std::string& fileName)
{
    ....
}