[解決済み】C++で "super "を使用する方法
質問
私のコーディングスタイルには、次のようなイディオムがあります。
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ドル程度で手に入る。
関連
-
[解決済み] エラーが発生する。ISO C++は型を持たない宣言を禁じています。
-
[解決済み】致命的なエラー LNK1169: ゲームプログラミングで1つ以上の多重定義されたシンボルが発見された
-
[解決済み】テンプレートの引数1が無効です(Code::Blocks Win Vista) - テンプレートは使いません。
-
[解決済み】fpermissiveフラグは何をするのですか?
-
[解決済み] [Solved] インクルードファイルが開けません。'stdio.h' - Visual Studio Community 2017 - C++ Error
-
[解決済み】1つ以上の多重定義されたシンボルが見つかる
-
[解決済み] gdbを使用してもデバッグシンボルが見つからない
-
[解決済み] 変数サイズのオブジェクトが初期化されないことがある c++
-
[解決済み] C++の継承 - アクセス不能なベース?
-
[解決済み] using namespace std;」はなぜバッドプラクティスだと言われるのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] テスト
-
[解決済み】getline()が何らかの入力の後に使用されると動作しない 【重複あり
-
[解決済み】非静的メンバ関数への参照を呼び出す必要がある
-
[解決済み】致命的なエラー LNK1169: ゲームプログラミングで1つ以上の多重定義されたシンボルが発見された
-
[解決済み】デバッグアサーションに失敗しました。C++のベクトル添え字が範囲外
-
[解決済み】cc1plus:エラー:g++で認識されないコマンドラインオプション"-std=c++11"
-
[解決済み] [Solved] インクルードファイルが開けません。'stdio.h' - Visual Studio Community 2017 - C++ Error
-
[解決済み】Enterキーを押して続行する
-
[解決済み】'std::cout'への未定義の参照
-
[解決済み】c++で.txtファイルから2次元の配列に読み込む