【问题标题】:Pass additional arguments in derived class for an abstract class function在派生类中为抽象类函数传递附加参数
【发布时间】:2016-03-04 20:48:42
【问题描述】:

假设给了我一个抽象类,

class A
{
 public:
  A(){};
  virtual ~A(){};

  virtual float func(const int in1, const int in2, const int in3) = 0;

  //
  // Some default useful functions
  //
 private:
  //
  // Some infrastructure code
  //
};

在大多数情况下它工作得很好

class A1 : public A
{
 public:
  A1(){};
  virtual ~A1(){};

  virtual float func(const int in1, const int in2, const int in3)
  {
    // Do something to in1, in2, in3 to get output
  }
};

但是假设对于 A20,我需要传递一个额外的参数来使函数工作,但我仍然想使用这个抽象类,因为除了这个额外的参数之外,其他一切都是相似的。我能想到的唯一方法是通过构造函数传递参数并存储副本。这种解决方法是否被视为良好做法?

class A20 : public A
{
 public:
  A20(const int in4) : m_in4(in4){};
  virtual ~A20(){};

  virtual float func(const int in1, const int in2, const int in3)
  {
    // Do something to in1, in2, in3, m_in4 to get output
  }

 private:
  int m_in4;
};

如果不是最好的方法是什么?为函数复制另一个具有 4 个输入的抽象类会更好吗?还是让A20独立于A,将“一些默认有用的功能”和“一些基础设施代码”从A复制到A20中更好?

编辑:稻田的评论

【问题讨论】:

  • 很难在没有上下文的情况下评论设计。如果您在构造函数中设置的额外值在对象的生命周期内保持不变,我会说没关系。
  • 也许 c++ 11 虚函数重载对你有帮助? stackoverflow.com/questions/15827632/…
  • 这样做完全没问题。但是在您的情况下它是否是好的设计可能真的取决于func 的含义以及该额外参数与传递的其他参数的关系。旁注:您应该使用初始化列表来设置该成员变量:A20( const int in4 ) : m_in4( in4) {}
  • @PatrickH override 不能重载具有不同数量参数的虚函数,您的解决方案需要在抽象类中添加一个具有 4 个输入的非纯虚函数,对吗?
  • @user3667089 这是另一个重载纯虚函数的例子。 stackoverflow.com/questions/23955177/…我想你的A20班可以做到吗?

标签: c++ function oop constructor abstract-class


【解决方案1】:

我认为一种方法是向基类 A 添加一个额外的可选参数。

class A
{
 public:
  A(){};
  virtual ~A(){};

  virtual float func(const int in1, const int in2, const int in3, int 4 = some_def_value) = 0;

  //
  // Some default useful functions
  //
 private:
  //
  // Some infrastructure code
  //

你应该保持这个默认值一致,不要在类 A20 的覆盖函数中覆盖它。

【讨论】:

  • 想到了,但我听说使用默认参数是不好的做法。此外,如果我有一个 A30 想要将第四个参数作为浮点数传递,这似乎也不灵活怎么办?
  • 如果您没有在实现中保持默认值一致,这是一种不好的做法。如果你想让它更灵活,你可以选择使用模板或空指针...
猜你喜欢
  • 1970-01-01
  • 2021-05-25
  • 2014-04-12
  • 2013-05-11
  • 2021-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-06
相关资源
最近更新 更多