Search code examples
c++templatesderived-classbase-class

How to describe the inherited class?


I have one Base and many (1..N) Derived classes like that:

class Base {
public:
  virtual void OnMouseMove(int x, int y) = 0;
}

class Derived_1: public Base {
public:
  void OnMouseMove(int x, int y) override;
}

class Derived_2: public Base {
public:
  void OnMouseMove(int x, int y) override;
}

void Derived_1::OnMouseMove(int x, int y) {actions 1};
void Derived_2::OnMouseMove(int x, int y) {actions 2};

All derived classes have the same definition but different OnMouseMove() functions. I do not like how the program looks, because I have to write in header files all the same derived functions only with different names Derived_1, Derived_2.

Is it possible to write program shorter? I need something like that:

class Derived: public Base {
public:
  void OnMouseMove(int x, int y) override;
}

class Derived_1 : public Derived{};
class Derived_2 : public Derived{};

void Derived_1::OnMouseMove(int x, int y) {actions 1};
void Derived_2::OnMouseMove(int x, int y) {actions 1};

Solution

  • What about using templates in that case like this one:

    class Base {
    public:
      virtual void OnMouseMove(int x, int y) = 0;
    };  
    
    template < int N>
    class Derived: public Base {
    public:
      void OnMouseMove(int x, int y) override;
    };
    
    template<> void Derived<1>::OnMouseMove(int x, int y) {std::cout<< "1"<< std::endl;}
    template<> void Derived<2>::OnMouseMove(int x, int y) {std::cout<< "2"<< std::endl;}
    
    int main()
    {
        Base* ptr1 = new Derived<1>;
        Base* ptr2 = new Derived<2>;
    
        ptr1->OnMouseMove(5,6);
        ptr2->OnMouseMove(5,6);
    }