9

私はこのコードを持っています:

#include <iostream>
#include <string>

using namespace std;

class A {
    public: void Print(int i) {cout<<i;}
};

class B : public A {
    public: void Print(string s) {cout<<s;}
};

int main() {
    B bInstance;
    bInstance.Print(1);
    return 0;
}

これは私にエラーを与えます:

error: invalid conversion from 'int' to 'const char*' [-fpermissive]

つまり、継承されたオーバーロードを考慮せずに B の Print を呼び出そうとしています。ただし、A の Print は B インスタンスから呼び出せる必要があります。実際、呼び出しを次のように変更すると、

bInstance.A::Print(1);

その後、エラーなしでコンパイルされますが、クラススコープ演算子を毎回記述する必要がないようにしたかったのです。基本クラスの関数のオーバーロードを呼び出そうとしていることをコンパイラに伝える方法はありますか?

4

1 に答える 1

13

Print()サブクラスのメンバー関数は、スーパークラスのメンバー関数を隠しPrint()ます。したがって、コンパイラはを認識せず、A::Print()を呼び出そうとし、 を文字列に変換できないとB::Print()不平を言います。int

オーバーA::Print()ロード セットに入れるには、次のusing宣言を導入できます。

class A {
public: 
    void Print(int i) {cout<<i;}
};

class B : public A {
public:
    using A::Print;
//  ^^^^^^^^^^^^^^^
    void Print(string s) {cout<<s;}
};

必要な変更を加えた後のコードの実際の動作例を次に示します。

于 2013-03-21T19:41:19.880 に答える