идиома невиртуального интерфейса для более чем двух уровней наследования?

StackOverflow https://stackoverflow.com/questions/117708

Вопрос

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

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

Это было полезно?

Решение

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

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


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

Другие советы

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top