Что такое частное наследование и какие проблемы оно решает?

Может ли кто-нибудь объяснить, для чего конкретно закрытое / защищенное наследование в C++, и какую проблему (проблемы) он намеревается решить?

class Bar { };
class Foo : private Bar { };

Я уже видел этот вопрос, но я все еще не понимаю, что это такое, не говоря уже о том, когда я должен его использовать.

(Сравнение с функциями в Java/C# или аналогичных языках также может быть полезным.)

4 ответа

Решение

Модели частного наследования "реализованы в терминах". Значение похоже на "имеет-а". Различия:

  1. При частном наследовании вам не нужно писать обертку (хорошо для ленивых программистов)

  2. "has-a" позволяет вам лучше контролировать, вы можете выставить только подмножество интерфейса или изменить имена методов, если хотите.

  3. Частное наследование затрудняет безопасность исключений, посмотрите на исключительный C++ для получения дополнительной информации

  4. Вы действительно нуждаетесь в частном наследовании именно тогда, когда вы хотите использовать защищенные члены вашего базового класса.

  5. Иногда частное наследование используется в классе mix-in (главы "Эффективное управление памятью на C++")

Мое личное предпочтение - использовать has-a для общего назначения, я использую частное наследование сразу после того, как исключаю другие варианты.

Чтобы понять частное наследование, вы должны сначала понять публичное наследование.

Если у вас есть следующее:

class Base
{
public:
  void SomeFunc();
};

class Pub : public class Base {};

Это означает, что разрешено следующее:

Pub aPub;
Base &basePart = aPub;

Вы можете взять производный класс и получить ссылку (или указатель) на базовый класс. Вы также можете сделать это:

Pub aPub;
aPub.SomeFunc();

То, что было публично в Base является публичным в Pub,

Публичное наследование означает, что каждый может повсюду получить доступ к компонентам базового класса из класса наследования

Частное наследование немного отличается:

class Priv : private class Base {};

Priv aPriv;
Base &basePart = aPriv;

Эта последняя строка не работает вообще. Частное наследование означает, что единственными функциями и классами, которые могут выполнять эту операцию, являются прямые члены Priv или друзья Priv, Если вы пишете этот код за пределами Priv член или друг, он не скомпилируется.

Так же:

Priv aPriv;
aPriv.SomeFunc();

Работает только если это внутри члена или друга Priv,

Частное наследование означает, что только члены или друзья производного класса могут получить доступ к компонентам базового класса. Таким образом, функции-члены могут вызывать часть базового класса производного класса, но никто во внешнем мире не может.

Когда вы публично выводите класс из другого класса, вы говорите, что производный класс "является" базовым классом. Это как раз один из тех типов. Когда вы в частном порядке наследуетесь от базового класса, вы скрываете его от внешнего мира. Это означает, что вы используете реализацию в базовом классе для реализации вашего производного класса, но никто больше не должен знать об этом. Производный класс "реализован в терминах" базового класса.

Частное наследование - это способ реализации композиции классов. В этом C++ FAQ есть целая глава на эту тему, см. http://www.parashift.com/c++-faq-lite/private-inheritance.html.

Это не решает проблемы, но позволяет вам больше вариантов дизайна кода, в этом случае все методы из Bar являются частными в Foo,

Другие вопросы по тегам