2010-02-23 1 views
13

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

+0

+1 в течение почти 20 лет программирования на C++. Я * никогда * не был в ситуации, когда мне нужно *, чтобы использовать множественную наследование. – Raedwald

+0

@ Raedwald это не значит, что кто-то не должен знать, как работает Multiple Inheritance в C++. – anonymous

ответ

11

Очень часто при использовании Policy-based design, например.

+1

Там есть пример учебника, но ничего не цитируется из реального мира. – Potatoswatter

4

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

0

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

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

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

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

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

0

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

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

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


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

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

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

+0

Это не настоящий пример слов. – Petter

2

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

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