Что такое частное наследование и какие проблемы оно решает? - PullRequest
3 голосов
/ 27 ноября 2011

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

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

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

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

Ответы [ 4 ]

5 голосов
/ 27 ноября 2011

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

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

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

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

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

  5. Иногда в классе смешивания используется частное наследование (главы по эффективному управлению памятью на c ++)

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

2 голосов
/ 27 ноября 2011

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

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

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;

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

Аналогично: * * тысяча тридцать-четырь

Priv aPriv;
aPriv.SomeFunc();

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

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

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

1 голос
/ 27 ноября 2011

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

0 голосов
/ 27 ноября 2011

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

...