如何在派生类中使用不同的参数正确覆盖函数?

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

isDone(Future) :-
    receive 
       Future  -> self(Pid),Pid ! Future;
       after 0 -> fail.

现在是params.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;
};

问题是我想为class IParams { }; class QEParams : public IParams { public: int a; int b; int c; }; 创建void initialize(QEParams iParams)函数并将QEExec传递给它,以便能够访问a,b和c参数(我需要后来),但由于QEParams而无法这样做。我认为,如果virtual void initialize(IParams)是从QEParams派生的,则可以这样做,但是我无法访问前面提到的参数。如何使其工作,以便能够在初始化函数中访问a,b和c参数? 编辑:我将把它看起来像一张照片: https://i.stack.imgur.com/KWaSQ.jpg

XIAapple_pig 回答:如何在派生类中使用不同的参数正确覆盖函数?

听起来您使用OOP的方式不正确。

由于QEExec IExecutor(继承),因此initialize可以像IExecutor一样,两者都可以initialize的行为与其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中的名称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)
{
    ....
}
本文链接:https://www.f2er.com/3049694.html

大家都在问