如何在派生 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
对象做类似的事情。如果是这样,那么应该作用于 a
、b
和 c
的应该是 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;
};
- 接口没有任何字段
- 接口只有纯虚方法
- 姓名
initialize
of IExecutor
表示有些误解。看起来它应该在施工期间的乞讨中被调用一次。它应该隐藏在某些工厂创建对象实现 IExecutor
的步骤中
所以基本上我怀疑你需要更多这样的东西:
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)
{
....
}
我正在我的大学为 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
对象做类似的事情。如果是这样,那么应该作用于 a
、b
和 c
的应该是 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;
};
- 接口没有任何字段
- 接口只有纯虚方法
- 姓名
initialize
ofIExecutor
表示有些误解。看起来它应该在施工期间的乞讨中被调用一次。它应该隐藏在某些工厂创建对象实现IExecutor
的步骤中
所以基本上我怀疑你需要更多这样的东西:
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)
{
....
}