Gaya pengkodean saya termasuk idiom berikut:
class Derived : public Base
{
public :
typedef Base super; // note that it could be hidden in
// protected/private section, instead
// Etc.
} ;
Ini memungkinkan saya untuk menggunakan "super" sebagai alias ke Pangkalan, misalnya, dalam konstruktor:
Derived(int i, int j)
: super(i), J(j)
{
}
Atau bahkan ketika memanggil metode dari kelas dasar di dalam versinya yang ditimpa:
void Derived::foo()
{
super::foo() ;
// ... And then, do something else
}
Bahkan dapat dirantai (saya masih harus menemukan kegunaannya untuk itu):
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
}
Lagi pula, saya menemukan penggunaan "typedef super" sangat berguna, misalnya, ketika Base adalah verbose dan / atau templated.
Faktanya adalah bahwa super diimplementasikan di Jawa, serta di C # (di mana ia disebut "basis", kecuali saya salah). Tetapi C ++ tidak memiliki kata kunci ini.
Jadi, pertanyaan saya:
- Apakah penggunaan typedef ini sangat umum / jarang / tidak pernah terlihat dalam kode yang Anda gunakan?
- apakah ini penggunaan typedef super Ok (yaitu apakah Anda melihat alasan kuat atau tidak begitu kuat untuk tidak menggunakannya)?
- haruskah "super" menjadi hal yang baik, haruskah itu dibakukan dalam C ++, atau apakah sudah cukup menggunakan typedef?
Sunting: Roddy menyebutkan fakta bahwa typedef harus bersifat pribadi. Ini berarti setiap kelas turunan tidak akan dapat menggunakannya tanpa mendeklarasikan ulang. Tapi saya kira itu juga akan mencegah rantai super :: super (tapi siapa yang akan menangis untuk itu?).
Sunting 2: Sekarang, beberapa bulan setelah menggunakan "super" secara besar-besaran, saya sepenuh hati setuju dengan sudut pandang Roddy: "super" harus bersifat pribadi. Saya akan mengangkat jawaban dua kali, tapi saya rasa saya tidak bisa.
super
kelihatannya Java
dan itu tidak buruk, tapi ... Tapi C++
mendukung banyak warisan.
MyFirstBase<MyString, MyStruct<MyData, MyValue>>
mana-mana)
template <class baz> struct Foo {...void bar() {...} ...}; struct Foo2: Foo<AnnoyinglyLongListOfArguments> { void bar2() { ... Foo::bar(); ...} };
Ini bekerja untuk saya dengan gcc 9.1 --std = c ++ 1y (c ++ 14).