Прийнята відповідь пояснює це віртуальними приватними функціями, але це відповідає лише на одну конкретну грань питання, що значно обмеженіше, ніж те, що задала ОП. Отже, нам потрібно перефразовувати: Чому від нас потрібно оголошувати невіртуальні приватні функції у заголовках?
Інша відповідь посилається на той факт, що класи повинні бути оголошені в одному блоці - після цього вони запечатані і до них не можна додавати. Це ви б робили, пропустивши оголосити приватний метод у заголовку, а потім спробувати визначити його в іншому місці. Приємний момент. Чому деякі користувачі класу повинні мати змогу збільшувати його таким чином, що інші користувачі не можуть спостерігати? Приватні методи є частиною цього і не виключаються з цього. Але тоді ви запитуєте, чому вони включені, і це здається трохи тавтологічним. Чому користувачі класу повинні знати про них? Якщо їх не було видно, користувачі не змогли б додати жодного, і він готовий.
Отже, я хотів надати відповідь, яка замість того, щоб включати приватні методи за замовчуванням, дає конкретні моменти на користь того, щоб вони були видимі для користувачів. Механістична причина невіртуальних приватних функцій, що вимагають публічного декларування, наведена у статті Herb Sutter's GotW № 100 про ідіому Pimpl як частину її обґрунтування. Я не буду продовжувати про Pimpl тут, оскільки я впевнений, що ми всі про це знаємо. Але ось відповідний біт:
У C ++, коли що-небудь у визначенні класу файлів заголовка змінюється, усі користувачі цього класу повинні бути перекомпільовані - навіть якщо зміна стосувалася лише приватних членів класу, до яких користувачі цього класу навіть не можуть отримати доступ. Це пояснюється тим, що модель побудови C ++ заснована на текстовому включенні і тому, що C ++ передбачає, що абоненти знають дві основні речі про клас, на який можуть вплинути приватні члени:
- Розмір і макет : [про членів і віртуальних функцій - зрозуміло і чудово для роботи, але не для того, щоб ми тут]
- Функції : Код, що викликає, повинен мати можливість вирішувати виклики до функцій учасників класу, включаючи недоступні приватні функції, які перевантажують неприватні функції - якщо приватна функція краще відповідає, викликовий код не вдасться скомпілювати. (C ++ прийняв цілеспрямоване дизайнерське рішення провести вирішення перевантаження перед перевіркою доступності з міркувань безпеки. Наприклад, вважалося, що зміна доступності функції з приватної на публічну не повинна змінювати значення юридичного коду виклику.)
Звісно, Саттер є надзвичайно надійним джерелом як члена Комітету, тому він знає "обдумане дизайнерське рішення", коли його бачить. І думка вимагати публічного декларування приватних методів як способу уникнути зміненої семантики або випадково порушеної доступності пізніше - це, мабуть, найбільш переконливе обґрунтування. Вдячно, тому що вся справа здавалася досить безглуздою раніше!