スーパークラスの関数の過負荷
-
15-10-2019 - |
質問
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;
宣言は、利用可能な機能を作成します。
所属していません StackOverflow