Перегрузка функции суперкласса

Есть ли в стандарте 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 ++.

2 ответа

Решение

Вам нужно использовать декларацию using внутри определения класса 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; объявление делает функцию из A доступной.

Другие вопросы по тегам