Заставить производный класс для вызова базовой функции - PullRequest
6 голосов
/ 15 декабря 2009

Если я наследую класс от другого и перезаписываю функцию, я могу вызвать базовую функцию, вызвав Base::myFunction() внутри реализации myFunc в производном классе.

Однако - есть ли способ определить в моем классе Base, что базовая функция вызывается в любом случае, даже если ее не вызывать явно в перезаписанной функции? (до или после выполнения производной функции)

Или даже лучше, если у меня есть виртуальная функция в моем виртуальном классе Base и две реализованные частные функции before() и after(), можно ли определить в классе Base, что до и после вызывается функция в любом производном классе этого Base класса, before() и after() будут вызываться?

Спасибо!

Ответы [ 3 ]

21 голосов
/ 15 декабря 2009

Нет, это невозможно.
Но вы можете смоделировать это, вызвав другую виртуальную функцию, например, так:

class Base
{
public:
  void myFunc()
  {
    before();
    doMyFunc();
    after();
  }

  virtual void doMyFunc() = 0;
};
0 голосов
/ 15 декабря 2009

Отвечая на C ++, вы не можете иметь наследуемую функцию «невидимо», вызываемую так, как вы хотите.

Единственными методами, которые вызывают через унаследованные классы, являются конструкторы и деструкторы.

0 голосов
/ 15 декабря 2009

Вы пытаетесь предотвратить перегрузку / переопределение производного класса методом в базе. Вы можете поощрять это, помечая методы как «не переопределяемые» (в зависимости от языка), но всегда есть способ обойти это.

Другими словами, вы не можете заставить кого-то использовать ваш класс определенным образом, только скажите ему, как он должен использоваться.

...