Частное наследство, несмотря на название, на самом деле не является наследством - по крайней мере, извне (класса), где оно имеет значение.
По этой причине применяются другие правила. Говорят, что в C ++ частное наследование моделирует отношения «реализовано в терминах». Таким образом, очередь с приоритетами, которая реализована в виде кучи, может выглядеть так:
template <typename T, typename Comp = std::less<T> >
class priority_queue : private heap<T, Comp> {
// …
};
Лично я не вижу преимущества этого шаблона, и Нил уже заявил, что в большинстве случаев композиция фактически имеет преимущество перед частным наследованием.
Однако существует одно преимущество: поскольку это такой установленный шаблон, значение частного наследования сразу становится понятным опытному программисту на C ++; приведенный выше код скажет им, что очередь с приоритетами реализована в виде кучи - что было бы неочевидно, если бы классу просто удалось использовать кучу в качестве одного из его членов.
Частное наследование имеет тенденцию использоваться в C ++ главным образом для классов политики. Классическим примером являются распределители, которые определяют, как класс контейнера управляет внутренним хранением:
template <typename T, typename A = std::allocator<T> >
class vector : private A {
// …
};
Никакого вреда не причинено. Но опять же, это можно было бы сделать и с помощью композиции.