Как это происходит? Базовый класс переопределяет или игнорирует ограничения доступа производного класса?
При использовании Public Inheritance все открытые члены базового класса становятся открытыми членами производного класса. Так что Да Message()
является публичной функцией в Intermediate
.
Функция вызывается по указателю базового класса (Intermediate
). Функция общедоступна в базовом классе. Динамическая диспетчеризация (т.е. фактический вызов функции класса Derived) происходит только во время выполнения, поэтому это работает.
Вышесказанное связано с тем, что во время выполнения спецификаторы доступа не имеют значения, правила спецификатора доступа разрешаются и действуют только во время компиляции.
Если вы вызываете функцию по указателю производного класса, то во время компиляции компилятор обнаруживает, что Message()
объявлен private
в Final
и, следовательно, выдает ошибку.
При наследовании от класса Abstract производный класс ДОЛЖЕН предоставить определение для ALL виртуальных функций Pure базового класса, в противном случае это приведет также к классу Derived. будучи абстрактным классом.
Здесь Intermediate
класс - это абстрактный класс, и если вам не нужно создавать объекты этого класса, он будет работать нормально. Обратите внимание, что вы можете создать указатель на абстрактный класс.