以下の例では、
void f(double, double); // at global scope
struct Grandparent {
void f(int);
void f(double, double);
};
struct Parent : public Grandparent {
void f(int); // hides all overloads of Grandparent::f
};
struct Child : public Parent {
void g() { f(2.14, 3.17); } // resolves to Parent::f
};
Parent :: fの宣言は、署名に関係なく、すべての祖先の宣言をどのようにParent::f(int)
支配および非表示にしGrandparent::f(double, double)
ますか。つまり、2つのメンバー関数の署名が大きく異なる場合でも、の宣言を支配および非表示にしますか?
私はhttps://en.wikipedia.org/wiki/Dominance_(C%2B%2B)を介してこの例に出くわしました
隠されているのは名前だからです; 署名は含まれていません。名前検索のルールによると、
名前ルックアップは、以下で説明するようにスコープを調べ、任意の種類の宣言が少なくとも1つ見つかるまで調べます。その時点でルックアップは停止し、それ以上のスコープは調べられません。
この場合、名前f
がスコープ内で見つかると、Parent
名前の検索が停止します。の名前Grandparent
はまったく考慮されません。(BTW:名前の検索後、オーバーロード解決で署名がチェックされ、最適なものが選択されます)
期待した動作でない場合は、を介して名前を導入できますusing
。
struct Parent : public Grandparent {
using Grandparent::f;
void f(int);
};
struct Child : public Parent {
void g() { f(2.14, 3.17); } // refer to Grandparent::f(double, double)
};
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加