Mon style de codage comprend l'idiome suivant:
class Derived : public Base
{
public :
typedef Base super; // note that it could be hidden in
// protected/private section, instead
// Etc.
} ;
Cela me permet d'utiliser "super" comme alias de Base, par exemple, dans les constructeurs:
Derived(int i, int j)
: super(i), J(j)
{
}
Ou même lors de l'appel de la méthode à partir de la classe de base dans sa version remplacée:
void Derived::foo()
{
super::foo() ;
// ... And then, do something else
}
Il peut même être enchaîné (je dois encore trouver l'utilisation pour cela):
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
}
Quoi qu'il en soit, je trouve l'utilisation de "typedef super" très utile, par exemple, lorsque Base est verbeux et / ou modélisé.
Le fait est que super est implémenté en Java, ainsi qu'en C # (où il est appelé "base", sauf erreur). Mais C ++ n'a pas ce mot-clé.
Alors, mes questions:
- cette utilisation de typedef est-elle super courante / rare / jamais vue dans le code avec lequel vous travaillez?
- cette utilisation de typedef est-elle super ok (c.-à-d. voyez-vous des raisons fortes ou moins fortes de ne pas l'utiliser)?
- "super" devrait-il être une bonne chose, devrait-il être quelque peu standardisé en C ++, ou est-ce déjà une utilisation via un typedef?
Edit: Roddy a mentionné le fait que le typedef devrait être privé. Cela signifierait qu'aucune classe dérivée ne pourrait l'utiliser sans la redéclarer. Mais je suppose que cela empêcherait également le super :: super chaînage (mais qui va pleurer pour ça?).
Edit 2: Maintenant, quelques mois après avoir utilisé massivement "super", je suis entièrement d'accord avec le point de vue de Roddy: "super" devrait être privé. Je voterais deux fois sa réponse, mais je suppose que je ne peux pas.
super
ressemble Java
et ce n'est rien de mal, mais ... Mais C++
supporte l'héritage multiple.
MyFirstBase<MyString, MyStruct<MyData, MyValue>>
partout)
template <class baz> struct Foo {...void bar() {...} ...}; struct Foo2: Foo<AnnoyinglyLongListOfArguments> { void bar2() { ... Foo::bar(); ...} };
Cela m'a fonctionné avec gcc 9.1 --std = c ++ 1y (c ++ 14).