Почему этот метод не получен в наследство?

Ввиду следующего кода:

class Padre
{
  public:
    int func()
    { return 0; }

    int func2()
    { return 0; }
};

class Hija
  : public Padre
{
  public:
    int func(int param)
    { return param; }
};

int main()
{
  Hija clase;

  std::cout << clase.func(); << std::endl; // ERROR
  std::cout << clase.func(5); << std::endl; // OK
  std::cout << clase.func2(); << std::endl; // OK
}

По какой причине метод func класса отец не существует в классе дочь несмотря на то, что наследство публичное, и однако, func2 да?

11
задан 07.02.2017, 12:07
1 ответ

Потому что ты, случайно, призываешь функцию c++ названная Ямс Hiding, секции § 3.3.10 из настоящего стандарта для c++: (свободный перевод)

Ямс Hiding: Имя будет oculatado из-за ясного заявления с тем же именем в декларативном укрытом районе или в производных классах.

Имей в виду, что делать это считается плохой практикой ввиду того, что он оказывается мало интуитивным и рекомендует предотвращать это. И не относится друг к другу об ошибке, - так как он хорошо обусловлен в стандарте, - а скорее функция языка.

Правильное решение состояло бы в том, чтобы использовать различные имена для методов.

Но если у тебя нет другого выбора, или просто ты не хочешь использовать различные имена существует другая функция языка, чтобы делать ее видимой ясной формы в производном классе.

Его добиваются используя using

class Hija
  : public Padre
{
  public:
    using Padre::func; // <-- puedes hacerla visible así.

    int func(int param)
    { return param; }
};

Здесь ты можешь видеть программу функционируя вслед за исправлением.

Заметь: Имей в cuentra, за которым это последует даже если Hija::func он высказывается как private (видеть пример).

14
ответ дан 01.12.2019, 08:16