質問

C ++標準に、スーパークラスの機能を過負荷にすることを妨げる何かがありますか?

このクラスのペアから始めてください:

class A {            // super class
    int x;

public:
    void foo (int y) {x = y;}  // original definition
};

class B : public A { // derived class
    int x2;

public:
    void foo (int y, int z) {x2 = y + z;}  // overloaded
};

電話することができます B::foo() 簡単に:

    B b;
    b.foo (1, 2);  // [1]

しかし、私が電話しようとするなら A::foo() ...

    B b;
    b.foo (12);    // [2]

...コンパイラエラーが発生します:

test.cpp: In function 'void bar()':
test.cpp:18: error: no matching function for call to 'B::foo(int)'
test.cpp:12: note: candidates are: void B::foo(int, int)

私が何かを逃していないことを確認するために、私はの名前を変更しました B過負荷がないように機能します:

class B : public A {
    int x2;

public:
    void stuff (int y, int z) {x2 = y + z;}  // unique name
};

そして今、私は電話することができます A::foo() 2番目の例を使用します。

これは標準ですか? G ++を使用しています。

役に立ちましたか?

解決

クラスの定義内で宣言を使用する必要があります B:

class B : public A {
public:
    using A::foo;          // allow A::foo to be found
    void foo(int, int);
    // etc.
};

宣言を使用せずに、コンパイラは見つけます B::foo 名前の検索中は、同じ名前の他のエンティティのベースクラスを効果的に検索しないため、 A::foo 見つかりません。

他のヒント

あなたはオーバーライドしていません A::foo(int)代わりに、エイリアシングしている実装です A::foo 署名を(int)の代わりに(int、int)に変更します。ジェームズ・マクネリスが言及したように using A::foo; 宣言は、利用可能な機能を作成します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top