Частное наследство 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";
}
};