Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Используй MQL5 Cloud Network. Это безопасно!
Igor Volodin
3576
Igor Volodin 2015.11.22 22:51 
  • 15%
    (8)
  • 28%
    (15)
  • 2%
    (1)
  • 6%
    (3)
  • 0%
    (0)
  • 50%
    (27)
Всего проголосовало: 54
Igor Volodin
3576
Igor Volodin 2015.11.22 22:52  
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();
Dmitry Fedoseev
41260
Dmitry Fedoseev 2015.11.23 03:34  
В чем смысл опроса? Либо 25 либо ошибку отсутствия переменной value (в зависимости от protected или privare).
George Merts
3325
George Merts 2015.11.23 06:46  

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

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

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

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

Ihor Herasko
8468
Ihor Herasko 2015.11.23 07:14  
Опять 25))
Ihor Herasko
8468
Ihor Herasko 2015.11.23 07:16  
George Merts:

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

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

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

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

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

George Merts
3325
George Merts 2015.11.23 07:49  

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

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

Igor Volodin
3576
Igor Volodin 2015.11.23 07:52  
George Merts:

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

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

class Square:private Base 

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

 

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

privateint GetValue() 

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

Igor Volodin
3576
Igor Volodin 2015.11.23 07:55  
George Merts:

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


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

George Merts
3325
George Merts 2015.11.23 08:44  
Igor Volodin:

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

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

Igor Volodin:


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

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

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

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

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

/ /12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий