Краткий (но все еще выразительный) синтаксис C ++ для вызова методов базового класса - PullRequest
4 голосов
/ 12 марта 2010

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

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

Ответы [ 5 ]

8 голосов
/ 12 марта 2010

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

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

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

5 голосов
/ 12 марта 2010

1

if ( *((Base*)this) != child_ ) return true;

2

if ( *(static_cast<Base*>(this)) != child_ ) return true;

3

class Base  
{  
public:  
  bool operator != (Base&);  
  Base       & getBase()       { return *this;}
  Base const & getBase() const { return *this;}
}; 

if ( getBase() != child_ ) return true;
3 голосов
/ 12 марта 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 ++ для дополнительного обсуждения.

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

1 голос
/ 12 марта 2010
if (condition) return true;
return false;

может быть сокращено до

return condition;
0 голосов
/ 12 марта 2010

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

Это может быть немного более кратким, хотя: return ((Base&)*this) != child_;

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