Наследование C++ и функциональное переопределение

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

#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&)
21
задан Dan Neely 12 May 2019 в 14:05
поделиться

3 ответа

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

using X::spray;
28
ответ дан 29 November 2019 в 20:28
поделиться

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

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

5
ответ дан 29 November 2019 в 20:28
поделиться

, который так называется «прячется»: Y :: Spray скрывается x :: spray . Добавить с помощью Директивы:

class Y : public X
{
public:
   using X::spray;
   // ...
};
10
ответ дан 29 November 2019 в 20:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: