私は、プロジェクトでは「実装された」という意味で私的継承を使用しています。基本クラスはoperator []を定義しています。これは私が使いたい機能です。したがって、私は持っていますディレクティブを使用したプライベート継承、過負荷?
しかし、私はどのように私が得る演算子のバージョンを制御できますか?実際には、const
と非const
の両方のバージョンが必要です。これは達成できますか?
私は、プロジェクトでは「実装された」という意味で私的継承を使用しています。基本クラスはoperator []を定義しています。これは私が使いたい機能です。したがって、私は持っていますディレクティブを使用したプライベート継承、過負荷?
しかし、私はどのように私が得る演算子のバージョンを制御できますか?実際には、const
と非const
の両方のバージョンが必要です。これは達成できますか?
私の理解では、あなたのusing
はオペレータのさまざまなオーバーロードを自動的に持ち込むはずです。子クラスに持ち込まれることから除外するオーバーロードがありますか?その場合、親の中のいくつかの異なる名前の関数に分割し、必要なものだけをusing
に分割するほうが良いかもしれません。
これは期待通りに行われます。別の言葉で
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バージョンが提供されていない場合は、コンパイラエラーが発生します(これは継承がプライベートかパブリックかに関係なく動作します)。
この場合、構図を使用して私的継承ではなく望みの結果を得ることができます。 – James
ええ、私は知っている...代わりに転送コードの量を減らすために私的な継承に変更しました。だから、それは不可能ですか?関数はどのように選択されていますか? – carlpett
ここでプライベート継承ではなく、構図を使用すると、コードを書いて維持するのがはるかに簡単になります。経験則は、絶対に必要でないときには、C++の壁から外れた機能を使用しないことです(これまでの説明から、この場合は私的継承は必要ありません)。 –