Как описать унаследованный класс? - PullRequest
0 голосов
/ 22 февраля 2020

У меня есть одна база и много (1..N) Производные классы, подобные этим:

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};

Все производные классы имеют такое же определение , но разные функции OnMouseMove (). Мне не нравится, как выглядит программа, потому что я должен записывать в заголовочные файлы все те же производные функции только с разными именами Derived_1, Derived_2.

Можно ли написать программу короче? Мне нужно что-то подобное:

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};

1 Ответ

1 голос
/ 22 февраля 2020

Как насчет использования шаблонов в таком случае, как этот:

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);
} 
...