Search code examples
c++interfacevirtualoverloading

Override number of parameters of pure virtual functions


I have implemented the following interface:

template <typename T>
class Variable
{
public:
  Variable (T v) : m_value (v) {}
  virtual void Callback () = 0;
private:
  T m_value;
};

A proper derived class would be defined like this:

class Derived : public Variable<int>
{
public:
  Derived (int v) : Variable<int> (v) {}
  void Callback () {}
};

However, I would like to derive classes where Callback accepts different parameters (eg: void Callback (int a, int b)). Is there a way to do it?


Solution

  • This is a problem I ran in a number of times.

    This is impossible, and for good reasons, but there are ways to achieve essentially the same thing. Personally, I now use:

    struct Base
    {
      virtual void execute() = 0;
      virtual ~Base {}
    };
    
    class Derived: public Base
    {
    public:
      Derived(int a, int b): mA(a), mB(b), mR(0) {}
    
      int getResult() const { return mR; }
    
      virtual void execute() { mR = mA + mB; }
    
    private:
      int mA, mB, mR;
    };
    

    In action:

    int main(int argc, char* argv[])
    {
      std::unique_ptr<Base> derived(new Derived(1,2));
      derived->execute();
      return 0;
    } // main