My style of coding includes the following idiom:
class Derived : public Base { public : typedef Base super; // note that it could be hidden in // protected/private section, instead // Etc. } ; This enables me to use "super" as an alias to Base, for example, in constructors:
Derived(int i, int j) : super(i), J(j) { } Or even when calling the method from the base class inside its overridden version:
void Derived::foo() { super::foo() ; // ... And then, do something else } It can even be chained (I have still to find the use for that, though):
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 } Anyway, I find the use of "typedef super" very useful, for example, when Base is either verbose and/or templated.
The fact is that super is implemented in Java, as well as in C# (where it is called "base", unless I'm wrong). But C++ lacks this keyword.
So, my questions:
- is this use of typedef super common/rare/never seen in the code you work with?
- is this use of typedef super Ok (i.e. do you see strong or not so strong reasons to not use it)?
- should "super" be a good thing, should it be somewhat standardized in C++, or is this use through a typedef enough already?
Edit: Roddy mentionned the fact the typedef should be private. This would mean any derived class would not be able to use it without redeclaring it. But I guess it would also prevent the super::super chaining (but who's gonna cry for that?).
Edit 2: Now, some months after massively using "super", I wholeheartedly agree with Roddy's viewpoint: "super" should be private.

superlooks likeJavaand it is nothing bad, but... ButC++supports multiple inheritance.MyFirstBase<MyString, MyStruct<MyData, MyValue>>everywhere)template <class baz> struct Foo {...void bar() {...} ...}; struct Foo2: Foo<AnnoyinglyLongListOfArguments> { void bar2() { ... Foo::bar(); ...} };This worked to me with gcc 9.1 --std=c++1y (c++14).