Здравствуйте, Alexey Chen, Вы писали:
AC>Зачем нужны иерархии реализаций? Не абстракных интерфейсов, а именно полноценных реализаций. Это когда конкретные классы публично наследуются.
AC>Как бы исчерпывающего ответа я не знаю. Так, на пальцах и небольших примерах. Может кто-то обьяснит это фундаментально?
Прагматический ответ:
Чтобы всю реализацию [класса-предка] не переписывать [в наследнике] с нуля ради какого-то тюнинга или расширения.
А публичность — чтобы в наследнике не переписывать с нуля интерфейсы предка.
struct IX { ... };
struct IY { ... };
class Base : public IX, public IY
{
public:
nonvirtual_api();
...
};
class Derived_1 : public IX, public IY
{
Base* impl; // агрегация как альтернатива наследованию
...
// копируем интерфейс и реализацию (хотя бы в виде шлюзов к impl)
};
class Derived_2 : private Base,
// копируем интерфейс
public IX, public IY,
...
{
public:
// копируем интерфейс
using Base::nonvirtual_api();
...
};