10

スーパークラスの関数をオーバーロードすることを防ぐ 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++ を使用しています。

4

2 に答える 2

20

class の定義内で using 宣言を使用する必要がありますB

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

using 宣言がない場合、コンパイラはB::foo名前の検索中に検出し、事実上、同じ名前を持つ他のエンティティの基本クラスを検索しないため、A::foo検出されません。

于 2011-01-04T18:31:41.937 に答える
0

の実装をオーバーライドするのではA::foo(int)なく、エイリアスA::fooを作成し、署名を (int) ではなく (int,int) に変更します。James McNellis が述べたように、using A::foo;宣言により A からの関数が使用可能になります。

于 2011-01-04T18:46:14.333 に答える