Mi estilo de codificación incluye el siguiente modismo:
class Derived : public Base
{
public :
typedef Base super; // note that it could be hidden in
// protected/private section, instead
// Etc.
} ;
Esto me permite usar "super" como un alias de Base, por ejemplo, en constructores:
Derived(int i, int j)
: super(i), J(j)
{
}
O incluso cuando se llama al método desde la clase base dentro de su versión anulada:
void Derived::foo()
{
super::foo() ;
// ... And then, do something else
}
Incluso se puede encadenar (aunque todavía tengo que encontrar el uso para eso):
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
}
De todos modos, considero que el uso de "typedef super" es muy útil, por ejemplo, cuando Base es verbosa o con plantilla.
El hecho es que super se implementa en Java, así como en C # (donde se llama "base", a menos que me equivoque). Pero C ++ carece de esta palabra clave.
Entonces, mis preguntas:
- ¿Es este uso de typedef super común / raro / nunca visto en el código con el que trabaja?
- ¿Es este uso de typedef super Ok (es decir, ves razones fuertes o no tan fuertes para no usarlo)?
- ¿debería ser "super" algo bueno, debería estar algo estandarizado en C ++, o este uso ya no es suficiente?
Editar: Roddy mencionó el hecho de que typedef debería ser privado. Esto significaría que cualquier clase derivada no podría usarla sin redeclararla. Pero supongo que también evitaría el super :: super encadenamiento (pero ¿quién va a llorar por eso?).
Edición 2: Ahora, algunos meses después de usar masivamente "super", estoy totalmente de acuerdo con el punto de vista de Roddy: "super" debería ser privado. Votaría su respuesta dos veces, pero supongo que no puedo.
super
parece Java
y no es nada malo, pero ... Pero C++
admite herencia múltiple.
MyFirstBase<MyString, MyStruct<MyData, MyValue>>
todas partes)
template <class baz> struct Foo {...void bar() {...} ...}; struct Foo2: Foo<AnnoyinglyLongListOfArguments> { void bar2() { ... Foo::bar(); ...} };
Esto me funcionó con gcc 9.1 --std = c ++ 1y (c ++ 14).