Meu estilo de codificação inclui o seguinte idioma:
class Derived : public Base
{
public :
typedef Base super; // note that it could be hidden in
// protected/private section, instead
// Etc.
} ;
Isso me permite usar "super" como um alias para o Base, por exemplo, em construtores:
Derived(int i, int j)
: super(i), J(j)
{
}
Ou mesmo ao chamar o método da classe base dentro de sua versão substituída:
void Derived::foo()
{
super::foo() ;
// ... And then, do something else
}
Pode até ser encadeado (ainda preciso encontrar o uso para isso):
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 qualquer forma, acho muito útil o uso de "typedef super", por exemplo, quando o Base é detalhado e / ou modelado.
O fato é que super é implementado em Java e também em C # (onde é chamado de "base", a menos que eu esteja errado). Mas o C ++ não possui essa palavra-chave.
Então, minhas perguntas:
- esse uso de typedef é super comum / raro / nunca visto no código com o qual você trabalha?
- esse uso do typedef é super Ok (ou seja, você vê razões fortes ou não tão fortes para não usá-lo)?
- "super" deve ser uma coisa boa, deve ser um pouco padronizada em C ++, ou esse uso já é suficiente através de um typedef?
Edit: Roddy mencionou o fato de que o typedef deve ser privado. Isso significaria que qualquer classe derivada não seria capaz de usá-lo sem redeclará-lo. Mas acho que isso também impediria o super :: super encadeamento (mas quem vai chorar por isso?).
Edit 2: Agora, alguns meses depois de usar massivamente "super", concordo plenamente com o ponto de vista de Roddy: "super" deve ser privado. Eu votaria sua resposta duas vezes, mas acho que não posso.
super
parece Java
e não é nada ruim, mas ... Mas C++
suporta herança múltipla.
MyFirstBase<MyString, MyStruct<MyData, MyValue>>
em todos os lugares)
template <class baz> struct Foo {...void bar() {...} ...}; struct Foo2: Foo<AnnoyinglyLongListOfArguments> { void bar2() { ... Foo::bar(); ...} };
Isso funcionou para mim com o gcc 9.1 --std = c ++ 1y (c ++ 14).