Private - это всем кроме меня было известно?
От: Максим Россия  
Дата: 17.12.22 18:15
Оценка: 10 (3) :)))
Тут узнал, что в плюсах private методы это не про visibility, а про accessibility. То есть, если есть базовый класс с private виртуальными функциями, то в классах потомках переопределять эти закрытые методы не то что можно, а нужно, так как такой подход считается предпочтительным при проектировании (паттерн template method). Это я только один так плохо знаю плюсы или для кого-нибудь кроме меня это тоже откровение?
Errare humanum est
Re: Private - это всем кроме меня было известно?
От: Wawan Россия http://www.wawan.ru/resume
Дата: 17.12.22 18:40
Оценка:
заинтриговал заголовком, я подумал что тут про порно студию какой-то интересный момент, но в принципе не сильно ошибся
я читал в какой-то книжке что не рекомендуется менять доступность при наследовании, типа это плохо
Re[2]: Private - это всем кроме меня было известно?
От: Максим Россия  
Дата: 17.12.22 18:59
Оценка:
W>я читал в какой-то книжке что не рекомендуется менять доступность при наследовании, типа это плохо

Наверно не очень ясно написал. Вот пример:

struct Widget {
    virtual ~Widget() = default;
};

struct Text : virtual Widget {
    void set_text() { do_set_text(); }
private:
    virtual void do_set_text() = 0;
};

struct Colorful : virtual Widget {
    void set_color() { do_set_color(); }
private:
    virtual void do_set_color() = 0;
};

struct Placard : Colorful, Text {
private:
    void do_set_text() override { puts("P::DST"); }
    void do_set_color() override { puts("P::DSC"); }
};

struct Billboard : Text, Colorful {
private:
    void do_set_text() override { puts("B::DST"); }
    void do_set_color() override { puts("B::DSC"); }
};


https://quuxplusone.github.io/blog/2022/12/01/chimeric-ptr/
Или вот еще про то как это хорошо http://www.gotw.ca/publications/mill18.htm
Errare humanum est
Отредактировано 17.12.2022 19:02 Максим . Предыдущая версия . Еще …
Отредактировано 17.12.2022 19:00 Максим . Предыдущая версия .
Re: Private - это всем кроме меня было известно?
От: Videoman Россия https://hts.tv/
Дата: 17.12.22 22:10
Оценка: 6 (1)
Здравствуйте, Максим:

private методы еще и в перегрузках участвуют:
class object
{
    void fun(int) {};
public:   
    void fun(long) {};
};

int main()
{
  object obj;
  obj.fun(1); // error C2248: 'object::fun': cannot access private member declared in class 'object'
}
Отредактировано 17.12.2022 22:35 Videoman . Предыдущая версия .
Re: Private - это всем кроме меня было известно?
От: vlp  
Дата: 17.12.22 22:58
Оценка: 10 (2)
Все проще: это способ сделать уровень доступа минимально необходимым. Если виртуальная функция private, потомки могут ее переопределить, но не могут вызвать. Если protected, потомки могут и переопределить и вызвать. Если public — вызвать могут все. Исходя из этого и выбирать.

Без деталей "всегда хорошо" и "нужно" — это религия. Вполне можно проектировать код, где private virtual не будет. Но знать, что private virtual можно переопределить в потомке, помогает придумывать более гибкие архитектуры.

Насчет "знал" — вроде у Саттера написано.
Re: Private - это всем кроме меня было известно?
От: rg45 СССР  
Дата: 17.12.22 23:22
Оценка: 6 (1) +1
Здравствуйте, Максим, Вы писали:

М>Тут узнал, что в плюсах private методы это не про visibility, а про accessibility. То есть, если есть базовый класс с private виртуальными функциями, то в классах потомках переопределять эти закрытые методы не то что можно, а нужно, так как такой подход считается предпочтительным при проектировании (паттерн template method). Это я только один так плохо знаю плюсы или для кого-нибудь кроме меня это тоже откровение?


Ну вообще, они прямо так и называются: access specifiers, поэтому странно было бы ждать здесь чего-то другого. Ну и потом, тот подход, который ты описал, довольно широко распространен и известен как non-virtual interface pattern.
--
Не можешь достичь желаемого — пожелай достигнутого.
Отредактировано 17.12.2022 23:24 rg45 . Предыдущая версия .
Re[3]: Private - это всем кроме меня было известно?
От: LaptevVV Россия  
Дата: 18.12.22 03:46
Оценка: 6 (1)
Это ты случаем не про NVI узнал?
https://en.wikipedia.org/wiki/Non-virtual_interface_pattern
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.