1. ホーム
  2. c++

[解決済み】C++で "super "を使用する方法

2022-04-07 01:13:12

質問

私のコーディングスタイルには、次のようなイディオムがあります。

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
}

とにかく、quot;typedef super" の使用は、例えば Base が冗長であったりテンプレート化されていたりする場合に、非常に便利だと思うのです。

実は、superはJavaでもC#でも実装されている(間違っていなければ、"base"と呼ばれている)。しかし、C++にはこのキーワードがないのです。

では、質問です。

  • この typedef の使用は、あなたのコードでは超一般的/稀有/見たことがないものですか?
  • この typedef の使用は超 OK ですか(つまり、それを使用しない強い理由またはそうでない理由がありますか)?
  • C++で標準化されるべきなのか、それともtypedefを使ったこの使い方でもう十分なのか?

編集する Roddyはtypedefをprivateにすべきであると言及しました。これは,派生クラスがそれを再宣言しなければ使えないことを意味する。しかし、super::superの連鎖を防ぐこともできるだろう(しかし、誰がそんなことで泣くんだ)。

編集2 スーパーを多用した数ヶ月後、私はRoddy氏の見解に全面的に同意します。彼の答えに2度アップヴォートしたいところですが、それは無理でしょう。

解決方法は?

Bjarne Stroustrupは、以下のように言及しています。 C++の設計と進化 その super をキーワードとすることは、C++が初めて標準化されたときにISO C++標準化委員会で検討された。

Dag Bruckはこの拡張を提案し、基底クラスを"inherited."と呼んだ。この提案は多重継承の問題に言及し、曖昧な使い方にフラグを立てるものであった。 ストロストラップも納得していた。

議論の末、Dag Bruck(そう、提案者と同一人物)が、この提案は実装可能で、技術的に健全で、大きな欠陥がなく、多重継承を扱っていると書きました。 その一方で、十分な効果が得られず、委員会はもっととげとげしい問題を扱うべきだとした。

Michael Tiemann氏は遅れて到着し、この投稿で質問されたのと同じ手法で、typedef'ed superがうまく機能することを示した。

ということで、いや、これはおそらく標準化されることはないでしょう。

持っていない人は 設計と進化 は、表紙を飾るに十分な価値があります。 中古なら10ドル程度で手に入る。