在派生类中为抽象类函数传递其他参数

时间:2015-12-01 02:52:33

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

假设我有一个抽象类,

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中会更好吗?

编辑:paddy的评论

1 个答案:

答案 0 :(得分:0)

我认为这样做的一种方法是在基类A中添加一个额外的可选参数。

var counter = 0;

process.on('exit', function (val) {
  console.log("Counter", counter++);
  if (counter === 2) {
    console.log("Really exiting now");
    // change this to `false` if you want to see infinite loop :D
    process._exiting = true;
  } else {
    process._exiting = false;
  }
  process.exit(0);
});

您应该保持此默认值一致,而不是在A20类的覆盖函数中覆盖它。