Перегрузка функции суперкласса - PullRequest
9 голосов
/ 04 января 2011

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

18 голосов
/ 04 января 2011

Вам необходимо использовать объявление 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 не найден.

0 голосов
/ 04 января 2011

Вы не переопределяете реализацию A::foo(int), вместо этого вы используете псевдоним A::foo и меняете его подпись на (int, int) вместо (int). Как отметил Джеймс МакНеллис, объявление using A::foo; делает функцию доступной из A.

...