Mein Codierungsstil umfasst die folgende Redewendung:
class Derived : public Base
{
public :
typedef Base super; // note that it could be hidden in
// protected/private section, instead
// Etc.
} ;
Dies ermöglicht es mir, "super" als Alias für Base zu verwenden, beispielsweise in Konstruktoren:
Derived(int i, int j)
: super(i), J(j)
{
}
Oder sogar beim Aufrufen der Methode aus der Basisklasse in ihrer überschriebenen Version:
void Derived::foo()
{
super::foo() ;
// ... And then, do something else
}
Es kann sogar verkettet werden (ich muss jedoch noch die Verwendung dafür finden):
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
}
Wie auch immer, ich finde die Verwendung von "typedef super" sehr nützlich, zum Beispiel wenn Base entweder ausführlich und / oder mit Vorlagen versehen ist.
Tatsache ist, dass Super sowohl in Java als auch in C # implementiert ist (wo es "base" heißt, sofern ich mich nicht irre). In C ++ fehlt dieses Schlüsselwort.
Also meine Fragen:
- Ist diese Verwendung von typedef in dem Code, mit dem Sie arbeiten, sehr häufig / selten / nie zu sehen?
- ist diese Verwendung von typedef super Ok (dh sehen Sie starke oder nicht so starke Gründe, es nicht zu verwenden)?
- sollte "super" eine gute Sache sein, sollte es in C ++ etwas standardisiert sein, oder reicht diese Verwendung durch ein typedef bereits aus?
Edit: Roddy erwähnte die Tatsache, dass das typedef privat sein sollte. Dies würde bedeuten, dass eine abgeleitete Klasse sie nicht verwenden kann, ohne sie erneut zu deklarieren. Aber ich denke, es würde auch die Super :: Super-Verkettung verhindern (aber wer wird dafür weinen?).
Edit 2: Nun, einige Monate nachdem ich "super" massiv benutzt habe, stimme ich Roddys Standpunkt voll und ganz zu: "super" sollte privat sein. Ich würde seine Antwort zweimal positiv bewerten, aber ich denke, ich kann nicht.
super
sieht es so aus Java
und es ist nichts Schlimmes, aber ... C++
unterstützt aber Mehrfachvererbung.
MyFirstBase<MyString, MyStruct<MyData, MyValue>>
überall zu schreiben )
template <class baz> struct Foo {...void bar() {...} ...}; struct Foo2: Foo<AnnoyinglyLongListOfArguments> { void bar2() { ... Foo::bar(); ...} };
Das hat bei mir mit gcc 9.1 funktioniert --std = c ++ 1y (c ++ 14).