宣言(派生クラス)の使用
-
30-09-2019 - |
質問
struct B1{
int d;
void fb(){};
};
struct B2 : B1{
using B1::d;
using B1::fb;
int d; // why this gives error?
void fb(){} // and this does not?
};
int main(){}
なぜなら、 B1::fb()
として扱われます B1::fb(B1*)
and B2::fb()
扱われた B2::fb(B2*)
?つまり、暗黙のパラメーターは、これらを区別するのに役立ちますか?
$13.3.1/4-
派生クラスに使用することによって導入された非相続関数の場合、関数は、暗黙的オブジェクトパラメーターのタイプを定義する目的で派生クラスのメンバーであると見なされます。
解決
C ++標準(C ++03§7.3.3/12)が説明します。
a 使用を使用します ベースクラスの名前を派生クラスの範囲に、派生クラスのメンバー関数をオーバーライドし、/またはベースクラスの同じ名前とパラメータータイプでメンバー関数を非表示にします(矛盾するのではなく)。
あなたの例では、 B2::fb()
隠します B1::fb()
使用宣言によって導入されました。
両方を持っていることが不運である理由について using B1::d;
と int d;
の定義で B2
, 、C ++標準(C ++03§7.3.3/10)が説明します。
a以来 使用を使用します 宣言であり、同じ宣言地域の同じ名前の宣言の制限も適用されます 使用を使用します。
したがって、以下が不正に形成されているのと同じ理由で、それは不調です。それは、単一の宣言領域で同じ名前を持つ2つのオブジェクトになります。
struct S { int d; int d; };
所属していません StackOverflow