Не виртуальный интерфейс идиома для более чем двух уровней наследования?
Идиома невиртуального интерфейса описывает, как виртуальные методы являются непубличными точками настройки, а общедоступные методы не виртуальны, чтобы позволить базовому классу всегда контролировать, как называются точки настройки.
Это элегантная идиома, и мне нравится ее использовать, но как она работает, если производный класс сам по себе является базовым классом
2 ответа
Это работает, потому что производный класс может переопределять частную виртуальную функцию базового класса, даже если функция базового класса переопределяет свою функцию базового класса.
Это совершенно законно:
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();
};
Производный класс может решить для себя:
Вы можете просто полностью переопределить метод, реализовав виртуальную функцию. Вы можете дополнить метод, вызвав функцию "среднего класса" в некоторой точке вашего метода производного класса.
Если это не то, что вам нужно, вам нужно явно установить его в "среднем" классе. Я бы не стал, хотя. Если вы захотите этого, это, вероятно, означает, что вы не дали базовому классу достаточно очков настройки.