Мій стиль кодування включає таку ідіому:
class Derived : public Base
{
public :
typedef Base super; // note that it could be hidden in
// protected/private section, instead
// Etc.
} ;
Це дозволяє мені використовувати "super" як псевдонім Base, наприклад, у конструкторах:
Derived(int i, int j)
: super(i), J(j)
{
}
Або навіть при виклику методу з базового класу всередині його перекритої версії:
void Derived::foo()
{
super::foo() ;
// ... And then, do something else
}
Він навіть може бути прикутий (я все ще шукаю для цього застосування):
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
}
У будь-якому разі, я вважаю використання "typedef super" дуже корисним, наприклад, коли Base є або багатослівним, і / або шаблонним.
Справа в тому, що супер реалізується в Java, а також в C # (де його називають "базовим", якщо я не помиляюся). Але C ++ не має цього ключового слова.
Отже, мої запитання:
- це використання typedef дуже поширене / рідкісне / ніколи не зустрічалося в коді, з яким ви працюєте?
- це використання typedef super Гаразд (тобто ви бачите вагомі чи не такі сильні причини, щоб не використовувати його)?
- має бути "супер" хорошою справою, чи має вона бути дещо стандартизованою в C ++, або цього використання через typedef вже достатньо?
Редагувати: Родді згадав той факт, що typedef має бути приватним. Це означає, що будь-який похідний клас не зможе ним користуватися, не переоблаштовуючи його. Але я здогадуюсь, що це також заважатиме супер :: супер ланцюгу (але хто за це плаче?).
Редагування 2: Тепер, через кілька місяців після масового використання "супер", я від усієї думки погоджуюся з точкою зору Родді: "супер" повинен бути приватним. Я би підтримав його відповідь двічі, але, мабуть, не можу.
super
схоже, Java
і це нічого поганого, але ... Але C++
підтримує багаторазове успадкування.
MyFirstBase<MyString, MyStruct<MyData, MyValue>>
скрізь)
template <class baz> struct Foo {...void bar() {...} ...}; struct Foo2: Foo<AnnoyinglyLongListOfArguments> { void bar2() { ... Foo::bar(); ...} };
Це працювало для мене з gcc 9.1 --std = c ++ 1y (c ++ 14).