Переопределяющие методы в C ++ - PullRequest
4 голосов
/ 11 января 2012

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

Есть ли способ помочь выяснить, когда я переопределяю метод, чтобы я не забыл вызвать метод суперкласса? (Что-то вроде Java @Override, за исключением того, что C ++ не имеет аннотаций ...)

Ответы [ 3 ]

5 голосов
/ 11 января 2012

Одним из предложений является Не-виртуальный интерфейс Indiface . То есть, сделайте ваши открытые методы не виртуальными и заставьте их вызывать частные или защищенные виртуальные методы, которые производные классы могут переопределять для реализации своего конкретного поведения.

Если у вас нет контроля над базовым классом, вы можете использовать промежуточный класс:

class Foo // Don't control this one
{
  public:
    virtual void action();
};

class Bar : public Foo // Intermediate base class
{
  public:
    virtual void action()
    {
       doAction();
       Foo::action();
    }

  protected:
    virtual void doAction() = 0;
};

Получите ваши классы от Bar и переопределите doAction() для каждого. Вы могли бы даже иметь doBeforeAction() и doAfterAction() при необходимости.

3 голосов
/ 11 января 2012

Что касается Java @Override, то в C ++ 11 есть прямой эквивалент, а именно override специальный идентификатор .

К сожалению, ни @Override, ни override решить проблему, поскольку: (а) они необязательны;(б) ответственность за вызов метода базового класса по-прежнему возлагается на программиста.

Кроме того, я не знаю ни одного широко доступного метода, который бы решал проблему (это довольно сложно, особенно если учесть, что вы не обязательно не хочет вызывать метод базового класса - как машина должна знать?).

0 голосов
/ 11 января 2012

К сожалению, я не знаю общего механизма для этого.

В C ++, если вам нужно использовать функциональность базового класса в дополнение к дополнительным дочерним функциям, вы должны взглянуть на шаблон метода шаблона.,Таким образом, общая логика всегда живет в базовом классе, и нет способа забыть ее выполнить, и вы переопределяете в дочернем элементе только тот фрагмент, который вам нужно изменить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...