Задача по C++, которая сложнее, чем кажется | OTUS
⚡ Открываем подписку на курсы!
Проходите параллельно 3 онлайн-курса в месяц по цене одного.
Подробнее

Курсы

Программирование
Flutter Mobile Developer Подготовка к сертификации Oracle Java Programmer (OCAJP)
-8%
Алгоритмы и структуры данных
-12%
Web-разработчик на Python
-11%
Архитектура и шаблоны проектирования
-14%
JavaScript Developer. Basic Супер-интенсив «СУБД в высоконагруженных системах»
-18%
iOS-разработчик. Базовый курс
-23%
Разработчик на Spring Framework
-23%
Python Developer. Basic
-16%
C# ASP.NET Core разработчик
-18%
Разработчик программных роботов (RPA) на базе UiPath и PIX
-6%
Android Developer. Basic
-10%
C++ Developer. Professional Разработчик C# AWS для разработчиков Software Architect Unity Game Developer. Basic Разработчик голосовых ассистентов и чат-ботов Backend-разработка на Kotlin React.js Developer Разработчик Node.js Нереляционные базы данных Супер - интенсив по паттернам проектирования Супер - интенсив по Kubernetes Advanced Fullstack JavaScript developer
Инфраструктура
PostgreSQL
-10%
IoT-разработчик
-12%
Administrator Linux. Professional
-11%
Базы данных
-19%
Administrator Linux.Basic
-18%
Супер-интенсив «СУБД в высоконагруженных системах»
-18%
Разработчик программных роботов (RPA) на базе UiPath и PIX
-6%
Сетевой инженер AWS для разработчиков Software Architect Reverse-Engineering. Professional CI/CD VOIP инженер Супер-практикум по работе с протоколом BGP Супер - интенсив по паттернам проектирования Супер - интенсив по Kubernetes
Специализации Курсы в разработке Подготовительные курсы
+7 499 938-92-02

Задача по C++, которая сложнее, чем кажется

Cplus_Deep_29.11-5020-957dad.png

Задачка по C++, с которой мы предлагаем ознакомиться, может показаться сложнее, чем представляется на первый взгляд. Итак, у нас есть 2 простых класса:

class Parent {
  public:
  virtual void print(){ 
    std::cout<<"I am the parent class"<<std::endl; 
  }
};
class Derived : public Parent {
  public:
  virtual void print(int x){ 
    std::cout<<"I am the derived class"<<std::endl;
  }     
};

А теперь скажите, что выведут два кусочка кода, написанных ниже:

int main(){
  Derived *derived=new Derived;
  derived->print();
  return 0;
} 
int main(){
  Parent *derived = new Derived;
  derived->print();
  return 0;
} 

Решение

Не думайте, что всё так просто, как может показаться с первого взгляда, ведь решение будет следующим: 1) в 1-м случае мы получим ошибку; 2) в 2-м случае выведется «I am the parent class».

А теперь подробнее. В нашей задаче мы имеем дело с механизмом скрытия имён и перегрузки функций. В 1-м случае внутри производного класса функция переопределит родительские функции вне зависимости от их сигнатуры. В результате, несмотря на то, что в родительском классе есть функция, соответствующая вызываемой внутри main(), компилятор об этом не узнает, поэтому выдаст нам ошибку:

error: no matching function for call to 'Derived::print()'

Но почему же тогда во 2-м случае ошибки не будет, ведь мы тоже используем для вызова print() объект Derived?

Ключевой момент — поиск имени начинается не с фактического типа объекта, а с объявленного типа объекта (класса, который указан в типе переменной). А переменная derived типа Parent указывает на объект типа Derived, а значит, изначально поиск функции print() будет выполняться внутри класса Parent. В результате компиляция закончится успешно, а мы получим соответствующий вывод.

Источник

Не пропустите новые полезные статьи!

Спасибо за подписку!

Мы отправили вам письмо для подтверждения вашего email.
С уважением, OTUS!

Автор
0 комментариев
Для комментирования необходимо авторизоваться