2008-09-22 5 views
5

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

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

ответ

5

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

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


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

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^