Il mio stile di programmazione include il seguente linguaggio:
class Derived : public Base
{
public :
typedef Base super; // note that it could be hidden in
// protected/private section, instead
// Etc.
} ;
Questo mi permette di usare "super" come alias di Base, ad esempio nei costruttori:
Derived(int i, int j)
: super(i), J(j)
{
}
O anche quando si chiama il metodo dalla classe base all'interno della sua versione sostituita:
void Derived::foo()
{
super::foo() ;
// ... And then, do something else
}
Può anche essere incatenato (devo ancora trovare l'uso per quello, però):
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
}
Ad ogni modo, trovo molto utile l'uso di "typedef super", ad esempio, quando Base è prolisso e / o modellato.
Il fatto è che super è implementato in Java, così come in C # (dove si chiama "base", a meno che non mi sbagli). Ma al C ++ manca questa parola chiave.
Quindi, le mie domande:
- questo uso di typedef è molto comune / raro / mai visto nel codice con cui lavori?
- è questo uso di typedef super Ok (cioè vedi dei motivi forti o meno per non usarlo)?
- "super" dovrebbe essere una buona cosa, dovrebbe essere un po 'standardizzato in C ++, o è già abbastanza usato in un typedef?
Modifica: Roddy ha menzionato il fatto che il typedef dovrebbe essere privato. Ciò significherebbe che qualsiasi classe derivata non sarebbe in grado di usarla senza dichiararla nuovamente. Ma suppongo che impedirebbe anche il super :: super concatenamento (ma chi pianterà per questo?).
Modifica 2: Ora, alcuni mesi dopo aver usato in modo massiccio "super", sono pienamente d'accordo con il punto di vista di Roddy: "super" dovrebbe essere privato. Voterei la sua risposta due volte, ma credo di non poterlo fare.
super
sembra Java
e non è niente di male, ma ... Ma C++
supporta l'eredità multipla.
MyFirstBase<MyString, MyStruct<MyData, MyValue>>
ovunque)
template <class baz> struct Foo {...void bar() {...} ...}; struct Foo2: Foo<AnnoyinglyLongListOfArguments> { void bar2() { ... Foo::bar(); ...} };
questo mi ha funzionato con gcc 9.1 --std = c ++ 1y (c ++ 14).