これは、オーバーロード解決に基本クラス関数が含まれていないためです。同様の状況は、内部スコープで宣言された関数であり、外部スコープで宣言された関数をオーバーロードしません(下記の例を参照)。派生クラススコープが基本クラススコープ内にネストされていると想像できます。
コンパイラがD::insert
候補を見つけたら、それは基本クラスではそれ以上見えません。 D::insert
がない場合、コンパイラはinsert
メソッドを呼び出すための基本クラスを探します。これは、派生クラス内のすべてのB::insert
オーバーロード関数を紹介します
using B::insert;
:あなたが基本クラスからinsert
関数名を導入することにより、この問題を解決することができます。それともあなたが言うように、あなたが基底クラスのメソッドを明示的に呼び出すことができます。
d.B::insert(1)
他のコンテキストで同じように作品をオーバーロードする方法サンプルコード:
namespace Outer {
void foo(double d) {
std::cout << "Outer::foo(double d)\n";
}
namespace Inner {
//using Outer::foo; // uncomment to see "Outer::foo(double d)" in output
void foo(int n) {
std::cout << "Inner::foo(int n)\n";
}
void callMe() {
foo(1.1);
}
}
}
int main() {
Outer::Inner::callMe(); // Outputes: Inner::foo(int n)
}
か:
void foo(std::string s) {
std::cout << "foo(std::string s)\n";
}
void foo(double d) {
std::cout << "foo(double d)\n";
}
void foo(int n) {
std::cout << "foo(int n)\n";
}
int main() {
void foo(int d); // comment out to see foo(double d) in output
foo(1.1); // outputs: "foo(int n)", foo(double d) is hidden
//foo("hello"); // ups, it wont compile - name lookup in c++ happens before type checking
// commenting out `void foo(int d);` above will fix this.
}
https://isocpp.org/wiki/faq/strange-inheritance#hiding-rule – Oktalist