Перегрузка функции супер класса
-
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()
используя второй пример.
Это стандарт? Я использую 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;
Объявление делает функцию из доступной.