Вопрос

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top