Информация об изменениях

Сообщение Re[3]: Автоматический обход иерархии от 14.09.2022 12:23

Изменено 14.09.2022 12:29 Went

Re[3]: Автоматический обход иерархии
Здравствуйте, Kazmerchuk Pavel, Вы писали:

KP>Классов произвольное количество, функций две.

Можно написать шаблон класса-прокладки, который будет корректно вызывать нужные функции, а наследникам предоставлять другие функции для перекрытия:
// Код библиотеки
class A
{
  virtual void foo();
  virtual void bar();
};

template<class Base>
class UserInheritedProxy : public Base
{
protected:
  virtual void do_foo() {}
  virtual void do_bar() {}

private:
  virtual void foo() {Base::foo(); do_foo();}
  virtual void bar() {Base::bar(); do_bar();}
};

// Код пользователя
class User1 : UserInheritedProxy<A>
{
protected:
  virtual void do_foo() {UserInheritedProxy<A>::do_foo();} // Могу базу звать
  virtual void do_bar() {} // А могу не звать, результат одинаков.
}
Re[3]: Автоматический обход иерархии
Здравствуйте, Kazmerchuk Pavel, Вы писали:

KP>Классов произвольное количество, функций две.

Можно написать шаблон класса-прокладки, который будет корректно вызывать нужные функции, а наследникам предоставлять другие функции для перекрытия:
// Код библиотеки
class A
{
protected:
  virtual void foo();
  virtual void bar();
};

template<class Base>
class UserInheritedProxy : public Base
{
protected:
  virtual void do_foo() {}
  virtual void do_bar() {}

private:
  virtual void foo() {Base::foo(); do_foo();}
  virtual void bar() {Base::bar(); do_bar();}
};

// Код пользователя
class User1 : UserInheritedProxy<A>
{
protected:
  virtual void do_foo() {UserInheritedProxy<A>::do_foo();} // Могу базу звать
  virtual void do_bar() {} // А могу не звать, результат одинаков.
}