Мой стиль кодирования включает в себя следующую идиому:
class Derived : public Base
{
public :
typedef Base super; // note that it could be hidden in
// protected/private section, instead
// Etc.
} ;
Это позволяет мне использовать "супер" в качестве псевдонима для базы, например, в конструкторах:
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, а также в С# (где он называется "базой", если я не ошибаюсь). Но С++ не хватает этого ключевого слова.
Итак, мои вопросы:
- Это использование typedef супер общего/редкого/никогда не видел в коде, с которым вы работаете?
- Это использование typedef super Ok (т.е. вы видите сильные или не очень сильные причины не использовать его)?
- "супер" должно быть хорошо, если он будет несколько стандартизован в С++, или это использование уже через typedef уже?
Изменить: Родди отметил, что typedef должен быть закрытым. Это означает, что любой производный класс не сможет использовать его без повторного использования. Но я предполагаю, что это также помешало бы супер:: супер цепочку (но кто будет плакать за это?).
Изменить 2: Теперь, спустя несколько месяцев после массового использования "супер", я полностью согласен с точкой зрения Родди: "супер" должен быть закрытым. Я бы дважды отвел его ответ, но я думаю, что не могу.