Kodlama tarzım aşağıdaki deyimi içerir:
class Derived : public Base
{
public :
typedef Base super; // note that it could be hidden in
// protected/private section, instead
// Etc.
} ;
Bu, "süper" yi Base için bir takma ad olarak kullanmamı sağlıyor, örneğin yapıcılarda:
Derived(int i, int j)
: super(i), J(j)
{
}
Ya da yöntemi, geçersiz kılınan sürümünün içindeki temel sınıftan çağırırken:
void Derived::foo()
{
super::foo() ;
// ... And then, do something else
}
Zincirleme bile olabilir (yine de bunun için kullanımı bulmak zorundayım):
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
}
Her neyse, "Baseedef super" kullanımını çok yararlı buluyorum, örneğin Base ya ayrıntılı ve / veya şablonlu olduğunda.
Gerçek şu ki, süper Java'da ve C # 'da (yanlış olmadığım sürece "temel" olarak adlandırılır) uygulanır. Ancak C ++ bu anahtar kelimeden yoksundur.
Sorularım:
- typedef super common / rare / bu kodun hiç görülmediği bir kullanımı var mı?
- typedef super Ok'un bu kullanımı (yani kullanmamanız için güçlü veya çok güçlü olmayan nedenler görüyor musunuz?)
- "süper" iyi bir şey olmalı, C ++ ile biraz standartlaştırılmalı mı, yoksa bu kullanım zaten bir typedef ile zaten yeterli mi?
Düzenleme: Roddy, typedef'in özel olması gerektiğinden bahsetti. Bu, türetilmiş herhangi bir sınıfın onu yeniden açıklamadan kullanamayacağı anlamına gelir. Ama sanırım süper :: süper zincirlemeyi de önleyecekti (ama bunun için kim ağlayacak?).
Edit 2: Şimdi, birkaç ay kitlesel olarak "süper" kullandıktan sonra, yürekten Roddy'nin bakış açısına katılıyorum: "süper" özel olmalı. Cevabını iki kez iptal ederdim, ama sanırım yapamam.
super
benziyor Java
ve kötü bir şey değil, ama ... Ama C++
çoklu mirası destekliyor.
MyFirstBase<MyString, MyStruct<MyData, MyValue>>
her yere yazmak yerine )
template <class baz> struct Foo {...void bar() {...} ...}; struct Foo2: Foo<AnnoyinglyLongListOfArguments> { void bar2() { ... Foo::bar(); ...} };
Bu bana gcc 9.1 --std = c ++ 1y (c ++ 14) ile çalıştı.