Задачка по ООП MQL5. Выберите правильный вариант ответа (код ниже)

 
  • 15% (8)
  • 28% (15)
  • 2% (1)
  • 6% (3)
  • 0% (0)
  • 50% (27)
Всего проголосовало: 54
 
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();
 
В чем смысл опроса? Либо 25 либо ошибку отсутствия переменной value (в зависимости от protected или privare).
 

По идее, здесь явная логическая ошибка объявления наследования.

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

Зачем такие безбашенные действия ? Если мы хотим скрыть реализацию класса от внешних пользователей - надо все наследование Square делать приватным от Base

Лично я - никогда не использую приватные данные, только защищенные - вот, как раз для того, чтобы не возникало коллизий, кому можно обращаться к ним. Все наследники должны иметь право обращаться к собственным данным, и данным предка.

 
Опять 25))
 
George Merts:

Лично я - никогда не использую приватные данные, только защищенные - вот, как раз для того, чтобы не возникало коллизий, кому можно обращаться к ним. Все наследники должны иметь право обращаться к собственным данным, и данным предка. 

Так в этом случае так и есть: value - неприватный член класса Base. Только вот с виртуальным методом намудрено... 
 

Простой же пример. Это тот случай, когда базовый класс задает интерфейс взаимодействия с клиентом. А все дочерние лишь влияют на реализацию.

Причем в mql5 как и в c++ переопределяющий метод может иметь любой модификатор доступа.

А вот в Java, Delphi, например, модификатор доступа переопределенных методов дочерних классов может идти только в сторону расширения области видимости. 

 

На мой взгляд, это неверно. Доступ в наследниках может идти только в сторону сужения области видимости. Иначе так нарушается замысел базового класса. Если в базовом классе переменные предполагаются недоступными извне (или наследникам) - то эта идеология должна поддерживаться и наследниками.

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

 
George Merts:

По идее, здесь явная логическая ошибка объявления наследования.

Если мы хотим скрыть реализацию класса от внешних пользователей - надо все наследование Square делать приватным от Base

class Square:private Base 

Это не позволит работать вообще с методами определенными в классе-интерфейсе

 

Зато делая вот так

privateint GetValue() 

не получится вызвать GetValue ну и любую другую функцию отвечающую за особенности реализации у объектов дочерних классов, запрещено.

 
George Merts:

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


А вот тут сообщество Java программистов, да и C# (понижать область тоже нельзя)  бы с вами поспорило )

 
Igor Volodin:

Это не позволит работать вообще с методами определенными в классе-интерфейсе

Дык еще бы ! Если мы объявляем предка, как приватного (защищенного) - мы запрещаем работать со всеми его методами. Все правильно.

Igor Volodin:


А вот тут сообщество Java программистов, да и C# (понижать область тоже нельзя)  бы с вами поспорило )

Да, тут, скорее, спор больше религиозен, чем объективен.

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

Меня не раз выручало именно ограничение прав при наследовании. Беру класс, пытаюсь использовать - блин... защищенное наследование... что за чушь ? Кто мне не дает использовать защищенные данные ? А ну, определим функцию, дающую доступ к переменной... Упс... Совсем в другом месте появилась ошибка... Хм... не напрасно там защищенное наследование... Я, оказывается, подзабыл тонкости работы...

Возможно, я слишком "олдскульный" программист...

Причина обращения: