Мой стиль кодирования включает в себя следующую идиому:
class Derived : public Base
{
public :
typedef Base super; // note that it could be hidden in
// protected/private section, instead
// Etc.
} ;
Это позволяет мне использовать "super" в качестве псевдонима для Base, например, в конструкторах:
Derived(int i, int j)
: super(i), J(j)
{
}
Или даже при вызове метода из базового класса внутри его переопределенной версии:
void Derived::foo()
{
super::foo() ;
// ... And then, do something else
}
Он даже может быть прикован цепью (хотя я все еще должен найти применение для этого):
class DerivedDerived : public Derived
{
public :
typedef Derived super; // note that it could be hidden in
// protected/private section, instead
// Etc.
} ;
void DerivedDerived::bar()
{
super::bar() ; // will call Derived::bar
super::super::bar ; // will call Base::bar
// ... And then, do something else
}
В любом случае, я считаю использование «typedef super» очень полезным, например, когда Base либо многословен и / или шаблонизирован.
Дело в том, что super реализован в Java, а также в C # (где он называется "base", если я не ошибаюсь). Но в C ++ нет этого ключевого слова.
Итак, мои вопросы:
- это использование typedef super common / редко / никогда не встречалось в коде, с которым вы работаете?
- это использование typedef super Ok (т. Е. Вы видите веские или не очень веские причины не использовать его)?
- должно ли "супер" быть хорошей вещью, должно ли оно быть несколько стандартизировано в C ++, или уже достаточно использования через typedef?
Редактировать: Родди упомянул тот факт, что typedef должен быть закрытым. Это будет означать, что любой производный класс не сможет использовать его без повторного выделения. Но я думаю, это также предотвратит цепочку super :: super (но кто за это будет плакать?).
Редактировать 2: Теперь, спустя несколько месяцев после массового использования «супер», я искренне согласен с точкой зрения Родди: «супер» должен быть закрытым. Я бы дважды подтвердил его ответ, но, думаю, не смогу.