Каковы реальные примеры множественного наследования С++?

Кроме примеров учебников - в реальном мире - имеет ли смысл использовать множественное наследование (где более чем один из базовых классов не являются чистыми интерфейсами) в С++?

Ответы

Ответ 2

Легко указывать на iostream, который наследуется от istream и ostream. cin и cout равны istream и ostream соответственно, но fstream происходит от iostream.

Ответ 4

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

template <typename policy1, typename policy2>
class whatever {
    policy1 p1;
    policy2 p2;
public:
    void dosomething() { if (p1.enquire()) p2.dosomething(); }
};

Если вы не хотите использовать шаблоны по какой-либо причине, вы можете получить (некоторые) довольно похожие возможности с множественным наследованием:

class whatever : policy1, policy2 {   
    void dosomething() { if (enquire()) dosomething();  }

};

В обоих случаях вы в основном встраиваете экземпляр "политики" в свой новый объект. Поскольку мы используем частное наследование, LSP не беспокоится - как и в случае с шаблонами на основе политик, цель состоит не в создании большой иерархии, которая утверждает что-либо о взаимоотношениях между членами иерархии, а скорее просто о создании возможности создавать большое количество не связанных между собой классов по требованию.

Ответ 5

Я использовал множественное наследование в "реальном мире" - в задании, в котором я был вовлечен в кодирование приложения сопоставления.

К сожалению, я не могу вспомнить точный пример, который я нахожу невероятно расстраивающим.

Однако, вот интересная статья о рассматриваемых пунктах и ​​альтернативных шаблонах или решениях, которые следует рассмотреть:

http://www.parashift.com/c++-faq-lite/multiple-inheritance.html#faq-25.2

Мне нравится использование транспортных средств для примеров - особенно добавление в амфибийное транспортное средство.

Ответ 6

Множественное наследование определенно имеет свое место, и это может быть очень полезно. В качестве общего руководства базовый класс должен быть абстрактным, когда это возможно, а это значит, что вы не должны создавать объект из него, но ничто не мешает вам наследовать от конкретного класса. Это, безусловно, тоже заслуга, вы можете воспользоваться унаследованной реализацией из базового класса. Пример одного из ответов на iostream - хороший. Другим примером может быть, скажем, моделирование сотрудника, который также является владельцем/директором бизнеса, и вы будете его моделировать как

public class Director
{
   ................
   double CalculateDividend();
   bool ApproveBudget();
};

public class Employee
{
   ................
   double CalculateSalary();
};


public class WorkingDirector: Employee, Director
{
   ..............
};

Теперь объект WorkDirector может делать то, что может сделать Сотрудник и Директор, что идеально подходит в реальном мире. Нам даже не нужно было бы переписывать любую реализацию метода.

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