Часто використовую protected наслідування у такій ситуації (код дуже спрощено, суть збережена):
class cGlobalIO //Базовий абстрактний клас вводу/виводу
{
public:
virtual bool Write() = 0;
virtual bool Read() = 0;
virtual ~cGlobalIO() {}
}
class cFile: public cGlobalIO // Клас читання/запису файлу
{
HANDLE hFile;
public:
bool Write() {}
bool Read() {}
}
class cPCAPFile: protected cFile //клас роботи з PCAP файлом
{
public:
bool ReadPDU() {}
bool WritePDU() {}
}
Маємо клас сFile для роботи із файлами, у нього є public методи Write() та Read() для реалізації читання і запису масивів даних користувачем класу. Також маємо клас cPCAPFile, який використовує protected базування на cFile. Дана організація класів виходить з логіки їх призначення, адже об'єкт сPCAPFile - це фізично файл формату PCAP, в який не можна записувати довільні масиви даних. У свою чергу об'єкт класу cFile - це фізично звичайний файл, в який можна писати довільні дані. При роботі з об'єктами класу сPCAPFile необхідно сховати від користувача методи Write() та Read(), щоб користувач не зміг записати довільних даних та не зіпсував структуру PCAP файлу, також забезпечуємо доступ до методів WritePDU() і ReadPDU() для реалізації функціоналу по суті. У свою чергу усі інші об'єкти класу cFile повинні давати доступ користувачам до методів Write() та Read() щоб забезпечувати запис довільних даних у файли. У нашому випадку protected наслідування якраз і забезпечує необхідний функціонал.