C ++ наследование и переопределение функций - PullRequest
21 голосов
/ 29 января 2010

В C ++, будет ли функция-член базового класса переопределена своей производной функцией с тем же именем, , даже если ее прототип (число параметров, тип и константа) отличается ? Я думаю, что это глупый вопрос, так как многие веб-сайты говорят, что прототип функции должен быть таким же, чтобы это произошло; но почему приведенный ниже код не компилируется? Я считаю, что это очень простой случай наследования.

#include <iostream>
using std::cout;
using std::endl;

class A {};
class B {};

class X
{
public:
    void spray(A&)
    {
        cout << "Class A" << endl;
    }
};

class Y : public X
{
public:
    void spray(B&)
    {
        cout << "Class B" << endl;
    }
};

int main()
{
    A a;
    B b;
    Y y;

    y.spray(a);
    y.spray(b);

    return 0;
}

GCC бросает

error: no matching function for call to `Y::spray(A&)'
note: candidates are: void Y::spray(B&)

Ответы [ 3 ]

28 голосов
/ 29 января 2010

Используемый для описания этого термина термин «скрытие», а не «переопределение». Член производного класса по умолчанию делает недоступными любые члены базовых классов с одинаковыми именами, независимо от того, имеют ли они одинаковую подпись. Если вы хотите получить доступ к членам базового класса, вы можете перетащить их в производный класс с помощью объявления using. В этом случае добавьте следующее к class Y:

using X::spray;
10 голосов
/ 29 января 2010

Это так называемое «скрытие»: Y::spray скрывает X::spray. Добавить используя директиву:

class Y : public X
{
public:
   using X::spray;
   // ...
};
5 голосов
/ 29 января 2010

Классы являются областями видимости, а область видимости вложена в родительский объект. У вас точно такое же поведение с другими вложенными областями (пространства имен, блоки).

Что происходит, когда поиск имени ищет определение имени, он смотрит в текущем пространстве имен, затем в захватывающем пространстве имен и т. Д., Пока не найдет одно определение; затем поиск прекращается (без учета сложностей, вызванных зависимым от аргумента поиском имени - частью правил, которая позволяет использовать функцию, определенную в пространстве имен одного из ее аргументов).

...