私のコーディングスタイルには、次のイディオムが含まれています。
class Derived : public Base
{
public :
typedef Base super; // note that it could be hidden in
// protected/private section, instead
// Etc.
} ;
これにより、例えばコンストラクターでBaseのエイリアスとして「super」を使用できるようになります。
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
}
とにかく、たとえば、Baseが冗長またはテンプレート化されている場合など、 "typedef super"の使用は非常に便利です。
実際、superはJavaとC#で実装されています(私が間違っていない限り、「ベース」と呼ばれます)。しかし、C ++にはこのキーワードがありません。
だから、私の質問:
- typedefのこの使用は、あなたが使用するコードで見られる超一般的/まれ/決してありませんか?
- これはtypedef super Okの使用ですか(つまり、使用しないという強い理由またはそれほど強くない理由がわかりますか)?
- 「スーパー」は良いものである必要がありますか、それはC ++でいくらか標準化されている必要がありますか、それともtypedefによるこの使用はすでに十分ですか?
編集:ロディは、typedefはプライベートであるべきだと述べました。これは、派生クラスは再宣言しないと使用できないことを意味します。しかし、私はそれがsuper :: superチェーニングも防ぐと思います(しかし、誰がそれを叫ぶのでしょうか?)。
編集2:さて、「スーパー」を大量に使用してから数か月後、私はロディの見解に全面的に同意します。「スーパー」はプライベートである必要があります。私は彼の答えを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)で私に働きました。