1
抽象クラスで抽象(仮想)関数を呼び出す関数を定義します。しかし、私が抽象クラスを継承するとき、この関数は継承されません:抽象クラスで抽象関数を呼び出す方法
class A {
public:
virtual void f(int t) = 0;
void f() {
f(0);
}
};
class B : public A {
public:
void f(int t) override { }
// using A::f; // uncomment to fix the problem
};
int main() {
B b;
b.f(0); // works
b.f(); // error: no matching function for call to ‘B::f()’
}
なぜこれは機能しませんか?この問題を回避するにはusing A::f
を使用しますが、なぜA::f()
は継承されませんか?
'A :: f' *は継承されていますが、' B :: f(int) 'によって隠されています。名前の検索は、名前が見つかると停止します。引数が一致するかどうかは、この時点では関係ありません。より明確な例: 'B'がメンバ関数ではなく' f'という名前のメンバ変数を定義した場合、 'A :: f'も見つからないでしょう。 'b.f()'ではなく 'b.A :: f()'を書くと、プログラムがコンパイルされます。 – JohnB