2011-01-12 5 views
9

私は、プロジェクトでは「実装された」という意味で私的継承を使用しています。基本クラスはoperator []を定義しています。これは私が使いたい機能です。したがって、私は持っていますディレクティブを使用したプライベート継承、過負荷?

しかし、私はどのように私が得る演算子のバージョンを制御できますか?実際には、constと非constの両方のバージョンが必要です。これは達成できますか?

+3

この場合、構図を使用して私的継承ではなく望みの結果を得ることができます。 – James

+1

ええ、私は知っている...代わりに転送コードの量を減らすために私的な継承に変更しました。だから、それは不可能ですか?関数はどのように選択されていますか? – carlpett

+0

ここでプライベート継承ではなく、構図を使用すると、コードを書いて維持するのがはるかに簡単になります。経験則は、絶対に必要でないときには、C++の壁から外れた機能を使用しないことです(これまでの説明から、この場合は私的継承は必要ありません)。 –

答えて

6

私の理解では、あなたのusingはオペレータのさまざまなオーバーロードを自動的に持ち込むはずです。子クラスに持ち込まれることから除外するオーバーロードがありますか?その場合、親の中のいくつかの異なる名前の関数に分割し、必要なものだけをusingに分割するほうが良いかもしれません。

+0

私もそう思っていましたが、 'T&'と 'const T&'(テンプレートtypename T)の両方を返すバージョンがあるにもかかわらず、const-discardingからコンパイルエラーが発生します – carlpett

+0

これは " "時代...コードを調べて再コンパイルした後、突然動いて、私の人生は私が変わったことを理解できません。私はもう少し継承について学びましたが、何が変わったのですか?ありがとう! – carlpett

2

これは期待通りに行われます。別の言葉で

class A 
{ 
public: 
    int operator[](int idx) { return 0; } 
    int operator[](int idx) const { return 1; } 
}; 

class B : public A 
{ 
public: 
    using A::operator[]; 

    void opa() { cout << operator[](1) << endl; } 
    void opb() const { cout << operator[](1) << endl; } 
}; 

int main(void) 
{ 
    B b; 
    b.opa(); 
    b.opb(); 

    const B d = B(); 
    cout << d[1] << endl; // should trigger the const version of operator[] 
    return 0; 
} 

は、適切なCONST /非constのバージョンはBに注入されます。注:constバージョンが提供されていない場合は、コンパイラエラーが発生します(これは継承がプライベートかパブリックかに関係なく動作します)。

+0

ありがとう、良い例! – carlpett

+0

私は 'b [2];'または 'main'と同様のものを追加して、演算子関数が'クラスB 'の外部から直接使用できることを示します。 – aschepler

+0

@aschepler、良い点、更新されます... – Nim

関連する問題