W bardzo wąskim znaczeniu odpowiedź brzmi „Tak”: zakładając, że twoje podstawowe klasy lub interfejsy są zaprojektowane do jednego celu, dziedziczenie obu z nich tworzy klasę z wieloma obowiązkami. Jednak to, czy jest to „zła rzecz”, zależy od charakteru odziedziczonych klas lub interfejsów.
Możesz podzielić swoje klasy i interfejsy na dwie główne grupy - te dotyczące zasadniczej złożoności systemu i te dotyczące jego przypadkowej złożoności. Jeśli dziedziczy po więcej niż jednej klasie „zasadniczej złożoności”, jest źle; jeśli odziedziczysz po jednej „niezbędnej” i jednej lub więcej „przypadkowych” klasach, to jest OK.
Na przykład w systemie rozliczeniowym możesz mieć klasy do reprezentowania faktur i cykli rozliczeniowych (dotyczą one zasadniczej złożoności) oraz klasy do utrwalania obiektów (dotyczą przypadkowej złożoności). Jeśli odziedziczysz w ten sposób
class BillingCycleInvoice : public BillingCycle, public Invoice {
};
to źle: ponosisz BillingCycleInvoice
mieszaną odpowiedzialność, ponieważ dotyczy to zasadniczej złożoności systemu.
Z drugiej strony, jeśli odziedziczysz w ten sposób
class PersistentInvoice : public Invoice, public PersistentObject {
};
Twoja klasa jest w porządku: technicznie obsługuje dwa problemy naraz, ale ponieważ tylko jeden z nich jest niezbędny, możesz odpisać dziedziczenie przypadkowe jako „koszt prowadzenia działalności gospodarczej”.