2016-06-25 18 views
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()は継承されませんか?

+1

'A :: f' *は継承されていますが、' B :: f(int) 'によって隠されています。名前の検索は、名前が見つかると停止します。引数が一致するかどうかは、この時点では関係ありません。より明確な例: 'B'がメンバ関数ではなく' f'という名前のメンバ変数を定義した場合、 'A :: f'も見つからないでしょう。 'b.f()'ではなく 'b.A :: f()'を書くと、プログラムがコンパイルされます。 – JohnB

答えて

2

Bにはf()が含まれていないため、f(int)のみが機能しません。

Bには、fという名前の関数がない場合、スーパークラスは、オーバーロード解決が行われている一致する関数が検索されます。しかしサブクラスBは既にfという名前のファンクションを持っているため、スーパークラスは検索されず、オーバーロードの解決はBで行われます。

スーパークラスのf()Bの名前空間の一部にするために、これはusingキーワードです。ここでの答えは、実際は「これがC++の仕組みだからです」ということです。

関連する問題