Частное наследство VS состав: когда использовать что?

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

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

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 ответ

Этот раздел часто задаваемых вопросов 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";
     }
 };
Другие вопросы по тегам