не виртуальный интерфейс для более чем двух уровней наследования - PullRequest
5 голосов
/ 23 сентября 2008

Идиома невиртуального интерфейса описывает, как виртуальные методы являются непубличными точками настройки, а общедоступные методы не виртуальны, чтобы позволить базовому классу всегда контролировать, как называются точки настройки.

Это элегантная идиома, и мне нравится ее использовать, но как она работает, если производный класс сам по себе является базовым классом

Ответы [ 2 ]

5 голосов
/ 23 сентября 2008

Это работает, потому что производный класс может переопределять частную виртуальную функцию базового класса, даже если функция базового класса переопределяет свою функцию базового класса.

Это совершенно законно:


class Parent
{
public:
  int foo() {return bar();} // the non-virtual public interface
private
  virtual int bar();
};

class Child : public Parent
{
private:
  virtual int bar();  // overrides Parent::bar()
};

class Grandchild : public Child
{
private:
  virtual int bar(); // overrides Child::bar();
};
1 голос
/ 23 сентября 2008

Производный класс может решить для себя:

Вы можете просто полностью переопределить метод, реализовав виртуальную функцию. Вы можете дополнить метод, вызвав функцию 'среднего' класса в некоторой точке вашего метода производного класса.

Если это не то, что вам нужно, вам нужно явно установить его в «среднем» классе. Я бы не стал, хотя. Если вы обнаружите, что хотите этого, это, вероятно, означает, что вы не дали базовому классу достаточно очков настройки.

...