在派生类中为抽象类函数传递附加参数

Pass additional arguments in derived class for an abstract class function

本文关键字:参数 类函数 抽象类 派生 抽象      更新时间:2023-10-16

假设给了我一个抽象类

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中的"一些默认有用功能"answers"一些基础设施代码"复制到A20中更好?

编辑:paddy的评论

我认为一种方法是在基类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的重写函数中重写它。