Добавить в корзинуПозвонить
Найти в Дзене

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

Статья подготовлена для студентов курса «Разработчик C+» в образовательном проекте OTUS. Задачка по C++, с которой мы предлагаем ознакомиться, может показаться сложнее, чем представляется на первый взгляд. Итак, у нас есть 2 простых класса: А теперь скажите, что выведут два кусочка кода, написанных ниже: Решение Не думайте, что всё так просто, как может показаться с первого взгляда, ведь решение будет следующим: 1) в 1-м случае мы получим ошибку; 2) в 2-м случае выведется «I am the parent class». А теперь подробнее. В нашей задаче мы имеем дело с механизмом скрытия имён и перегрузки функций. В 1-м случае внутри производного класса функция переопределит родительские функции вне зависимости от их сигнатуры. В результате, несмотря на то, что в родительском классе есть функция, соответствующая вызываемой внутри main(), компилятор об этом не узнает, поэтому выдаст нам ошибку: Но почему же тогда во 2-м случае ошибки не будет, ведь мы тоже используем для вызова print() объект Deri
Статья подготовлена для студентов курса «Разработчик C+» в образовательном проекте OTUS.

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

-2

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

-3

Решение

Не думайте, что всё так просто, как может показаться с первого взгляда, ведь решение будет следующим:

1) в 1-м случае мы получим ошибку;

2) в 2-м случае выведется «I am the parent class».

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

-4

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

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

Источник

Уверенно владеете языком стандарта C++03, SQL, основами computer science и понятие deadlock не ставит Вас в deadlock?
Тогда ждём на курсе «Разработчик C++» именно Вас!
Наука
7 млн интересуются