Мой стиль кодирования включает в себя следующую идиому:
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 # (где его называют «базовым», если я не ошибаюсь). Но C ++ не хватает этого ключевого слова.
Итак, мои вопросы:
- такое использование typedef супер распространено / редко / никогда не встречалось в коде, с которым вы работаете?
- Это использование typedef супер хорошо (то есть вы видите сильные или не очень веские причины не использовать его)?
- должно ли быть "super" хорошей вещью, должно ли оно быть несколько стандартизировано в C ++, или уже достаточно использования через typedef?
Изменить: Родди упомянул тот факт, что typedef должен быть закрытым. Это будет означать, что любой производный класс не сможет использовать его без повторного выделения. Но я думаю, что это также предотвратит цепочку super :: super (но кто за это будет плакать?).
Редактировать 2: Теперь, спустя несколько месяцев после массового использования «супер», я полностью согласен с точкой зрения Родди: «супер» должен быть частным. Я бы дважды подтвердил его ответ, но, думаю, не смогу.
super
выглядит Java
и ничего плохого, но ... Но C++
поддерживает множественное наследование.
MyFirstBase<MyString, MyStruct<MyData, MyValue>>
везде)
template <class baz> struct Foo {...void bar() {...} ...}; struct Foo2: Foo<AnnoyinglyLongListOfArguments> { void bar2() { ... Foo::bar(); ...} };
это сработало для меня с gcc 9.1 --std = c ++ 1y (c ++ 14).