2010-12-12 4 views
16

、代わりにスコープ演算子を使用しての、スーパーが使用されている例:「スーパー」と同等のC++? Javaでは

C++ -> GenericBase::SomeVirtualFunction(); 
Java -> super.someVirtualMethod(); 

はこのようなものがCであり++またはこれが原因で多重継承のC++で意味がありませんか?

おかげ

+2

私はC++の 'base'や' super'に相当するものは知りません。親クラスの名前を明示的に使用する必要があります。 – CodesInChaos

+7

私はあなた自身の質問に答えたと思います。 – someguy

+0

MSVCの__super。 2つの下線は、これが標準ではないことを明確にするためだけです。 –

答えて

4

あなたがtypedef独自に提供することができますが、C++にはそのようなことは、ありません:

struct Derived : Base 
{ 
    typedef Base super; 
}; 
+1

typedefを 'private:'セクションに入れることを推奨する@wqkingの答えを見てください。 – aldo

5

Microsoftコンパイラは(C++標準コミティによって拒否された)拡張子__superを持っています。

編集:スーパーはコードの読者を混乱させる可能性があります。 C++では複数の継承があるため、より明示的にする方がよいでしょう。多重継承はすでに複雑です。必要に応じて誰でもスーパースーパーを作成できるようになった後、落ち着いたテンプレートのためのスーパーの有用性に関するAFAIKの議論がありました。

+0

標準委員会がこれを拒否した理由についてのコメントはありますか? (私はそれが考慮されていたことに気づいていませんでした...) –

+2

私はまた、__superキーワードを使用して、基本クラスやものを変更している場合に多くを助けます。特にMFCで。それは標準ではない、非常に便利な機能です。 – Coder

5

マーティンのリンクのtypedefトリックは非常にうまくいきます(それは、C++にスーパーフレームワークや継承されたキーワークAFAIRがない理由の一部です)。私たちが気にする必要があるのは、typedefがプライベートセクション。保護されたセクションまたはpublicセクションに入れないでください。派生クラスは、親ではなく祖父母を参照するために型定義を使用するのが間違っているかもしれません。