- Создание и работа с проектом - Проекты и MQL5 Storage
- Настройки - Добро пожаловать в алготрейдинг
- Интеллектуальное управление - Разработка программ
class Base { protected: int value; public: void SetValue(int m) { value = m; } virtual int GetValue() { return (value); } void PrintResult() { Print(GetValue()); } }; class Square:public Base { private: int GetValue() { return (value*value); } }; Square s; s.SetValue(5); s.PrintResult();
По идее, здесь явная логическая ошибка объявления наследования.
Функция объявляется паблик в базовом классе, а потом она же перегружается как приватная. После чего в коде из невиртуальной функции происходит ее вызов.
Зачем такие безбашенные действия ? Если мы хотим скрыть реализацию класса от внешних пользователей - надо все наследование Square делать приватным от Base
Лично я - никогда не использую приватные данные, только защищенные - вот, как раз для того, чтобы не возникало коллизий, кому можно обращаться к ним. Все наследники должны иметь право обращаться к собственным данным, и данным предка.
Лично я - никогда не использую приватные данные, только защищенные - вот, как раз для того, чтобы не возникало коллизий, кому можно обращаться к ним. Все наследники должны иметь право обращаться к собственным данным, и данным предка.
Простой же пример. Это тот случай, когда базовый класс задает интерфейс взаимодействия с клиентом. А все дочерние лишь влияют на реализацию.
Причем в mql5 как и в c++ переопределяющий метод может иметь любой модификатор доступа.
А вот в Java, Delphi, например, модификатор доступа переопределенных методов дочерних классов может идти только в сторону расширения области видимости.
На мой взгляд, это неверно. Доступ в наследниках может идти только в сторону сужения области видимости. Иначе так нарушается замысел базового класса. Если в базовом классе переменные предполагаются недоступными извне (или наследникам) - то эта идеология должна поддерживаться и наследниками.
Расширение области видимости в наследниках, на мой взгляд, чревато тем, что потом будет вобще непонятно, какие переменные доступны извне, а какие нет.
По идее, здесь явная логическая ошибка объявления наследования.
Если мы хотим скрыть реализацию класса от внешних пользователей - надо все наследование Square делать приватным от Base
class Square:private Base
Это не позволит работать вообще с методами определенными в классе-интерфейсе
Зато делая вот так
private: int GetValue()
не получится вызвать GetValue ну и любую другую функцию отвечающую за особенности реализации у объектов дочерних классов, запрещено.
Расширение области видимости в наследниках, на мой взгляд, чревато тем, что потом будет вобще непонятно, какие переменные доступны извне, а какие нет.
А вот тут сообщество Java программистов, да и C# (понижать область тоже нельзя) бы с вами поспорило )
Это не позволит работать вообще с методами определенными в классе-интерфейсе
Дык еще бы ! Если мы объявляем предка, как приватного (защищенного) - мы запрещаем работать со всеми его методами. Все правильно.
А вот тут сообщество Java программистов, да и C# (понижать область тоже нельзя) бы с вами поспорило )
Да, тут, скорее, спор больше религиозен, чем объективен.
Я исхожу из "безопасности" кода. Код должен быть как можно проще, прозрачнее, и все неоднозначности должны трактоваться с позиций ограничения прав.
Меня не раз выручало именно ограничение прав при наследовании. Беру класс, пытаюсь использовать - блин... защищенное наследование... что за чушь ? Кто мне не дает использовать защищенные данные ? А ну, определим функцию, дающую доступ к переменной... Упс... Совсем в другом месте появилась ошибка... Хм... не напрасно там защищенное наследование... Я, оказывается, подзабыл тонкости работы...
Возможно, я слишком "олдскульный" программист...
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования