Краткий (но все же выразительный) синтаксис C ++ для вызова методов базового класса

Я хочу специально вызвать метод базового класса; как это сделать наиболее кратко? Например:

class Base
{
public:
  bool operator != (Base&);
};

class Child : public Base
{
public:
  bool operator != (Child& child_)
  {
    if(Base::operator!=(child_))  // Is there a more concise syntax than this?
      return true;

    // ... Some other comparisons that Base does not know about ...

    return false;
  }
};

person sivabudh    schedule 12.03.2010    source источник
comment
А то, как я это делаю, считается стандартом? например он будет работать на каких-либо компиляторах?   -  person sivabudh    schedule 12.03.2010
comment
KISS: будь проще ... Добавьте функцию is_equal к базовому классу и используйте ее в дочернем классе.   -  person alexkr    schedule 12.03.2010
comment
@AlexKR: спасибо за предложение. Хотя у меня есть реальная причина, по которой я должен использовать эти операторы .. = (   -  person sivabudh    schedule 12.03.2010
comment
operator!= должен быть константным методом и принимать константные параметры.   -  person kennytm    schedule 12.03.2010
comment
@KennyTM: спасибо за информацию. Я намеренно оставил их, просто чтобы быстро опубликовать пост. знак равно   -  person sivabudh    schedule 12.03.2010


Ответы (5)


Нет, это максимально кратко. Base::operator!= - это название метода.

И да, то, что вы делаете, стандартно.

Однако в вашем примере (если вы не удалили какой-либо код) вам вообще не нужен Child::operator!=. Он делает то же самое, что и Base::operator!=.

person Andrew Stein    schedule 12.03.2010
comment
@ Андрей: спасибо за замечание. Хотя, как вы уже догадались, я удалил код, чтобы упростить вопрос. знак равно - person sivabudh; 12.03.2010

То, что вы делаете, является наиболее кратким и "стандартным" способом, но некоторые люди предпочитают это:

class SomeBase
{
public:
    bool operator!=(const SomeBaseClass& other);
};

class SomeObject: public SomeBase
{
    typedef SomeBase base;  // Define alias for base class

public:
    bool operator!=(const SomeObject &other)
    {
        // Use alias
        if (base::operator!=(other))
            return true;

        // ...

        return false;
    }
};

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

Дополнительную информацию см. В разделе Использование слова super в C ++.

(Лично меня это не волнует и не рекомендую, но я думаю, что это один из правильных ответов на вопрос.)

person Kristopher Johnson    schedule 12.03.2010
comment
+1 за упоминание об этом: ... и если ваш базовый класс изменится, вам не нужно менять каждое его использование. Спасибо! - person sivabudh; 12.03.2010

if (condition) return true;
return false;

можно сократить до

return condition;
person fredoverflow    schedule 12.03.2010

Я бы избавился от структуры управления if / then и просто вернул бы возвращаемое значение оператора базового класса, но в остальном то, что вы делаете, нормально.

Впрочем, это может быть немного короче: return ((Base&)*this) != child_;

person Dathan    schedule 12.03.2010
comment
Если он собирается это сделать, он может просто полностью избавиться от функции и позволить вызову базового класса. Думаю, понятно, что раздел «Другие сравнения» нужно заполнить кодом. - person Kristopher Johnson; 12.03.2010

person    schedule
comment
Осторожный! Это работает только потому, что вы вызываете не виртуальные функции! - person ; 12.03.2010