Частное наследство VS состав: когда использовать что? - PullRequest
17 голосов
/ 26 августа 2011

Частное наследство против композиции.

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

class A
{
private:
    int z;
protected:
    int y;
public:
    int x;
};

class B : private A
{
    /* B's data members and methods */
    /* B has access only to A's public and protected */
};

class C : public B
{
    /* can access no fields of B */
};

C не сможет использовать любое из полей B.Когда я буду использовать личное наследование и когда я буду использовать композицию?

спасибо!

1 Ответ

20 голосов
/ 26 августа 2011

Эта статья часто задаваемых вопросов C ++ отвечает на ваши вопросы удачно.

Воспроизведение здесь:

Используйте композицию, когда можете, приватнаследование, когда вам нужно.

Обычно вы не хотите иметь доступ к внутренним объектам слишком многих других классов, а частное наследование дает вам некоторые из этих дополнительных полномочий (и ответственности).Но личное наследие не зло;поддерживать его просто дороже, поскольку увеличивает вероятность того, что кто-то изменит что-то, что нарушит ваш код.

Законное долгосрочное использование для частного наследования - это когда вы хотите создать class Fred, которыйиспользует код в class Wilma, а код из class Wilma должен вызывать функции-члены из вашего нового класса, Fred.В этом случае Fred вызывает не виртуалы в Wilma, а Wilma вызывает (обычно чистые виртуалы) сами по себе, которые переопределяются Fred.Это было бы намного сложнее сделать с композицией.

class Wilma {
 protected:
   void fredCallsWilma()
     {
       std::cout << "Wilma::fredCallsWilma()\n";
       wilmaCallsFred();
     }
   virtual void wilmaCallsFred() = 0;   // A pure virtual function
 };

 class Fred : private Wilma {
 public:
   void barney()
     {
       std::cout << "Fred::barney()\n";
       Wilma::fredCallsWilma();
     }
 protected:
   virtual void wilmaCallsFred()
     {
       std::cout << "Fred::wilmaCallsFred()\n";
     }
 };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...