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

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

6 ответов


Это очень распространено при использовании дизайн на основе политики, например.


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


Microsoft ATL (Active Template Library) использует множественное наследование в качестве классов mixin:

http://en.wikipedia.org/wiki/Active_Template_Library


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-так же, как и с шаблонами на основе политики, целью не является создание большой иерархии, которая утверждает что-либо об отношениях между членами иерархии-скорее, это просто о создании возможности создавать большое разнообразие несвязанных классов по требованию.


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

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

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

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

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


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

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

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


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

теперь объект WorkingDirector может делать то, что может сделать сотрудник и директор, что является идеальным в реальном мире. Нам даже не нужно будет перезаписывать какую-либо реализацию метода.

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