виртуального множественного наследования?
Реализация интерфейса
Ну начнем с того что наследование в целом опционально
Ситуация, в которую ты сам себя загнал, это если у двух классов есть общий предок
https://en.m.wikipedia.org/wiki/Virtual_inheritance Статья на самом деле отвечает на этот вопрос
Думаю нет таких задач Как и задач в которых без множественного наследования не обойтись
Реализация COM объектов
Я знаю кейс когда без множественного наследования не обойтись - это overload-visitor с косвенно-рекурсивными лямбдами Благодаря множественному наследованию мы можем отнаследоваться от нескольких лямбд и построить новый тип с перегруженным оператором круглых скобок auto fn = make_overload( [](this auto&& self, int val){ ... }, [](this auto&& self, double val){ ... }, [](this auto&& self, SomeType obj){ ... } ); fn(1); fn(1.23); fn(SomeType()); Разве можно получить такое (без оверхеда) если бы С++ не поддерживал бы множественное наследование?
Но это кейс обычного множественного наследования. И хотелось бы найти подобный пример (где раскрывается суть) для виртуального множественного наследования
Это синтаксический сахар который позволяет объединить несколько функторов в один тип. Без него можно обойтись.
Реализация COM делается через .QueryIntetface, где множественное наследование вообще не к месту. В COM вообще наследования нет. Есть агрегирование.
В пределе можно и без машины обойтись. На бумажке посчитать
это если мы не делаем систему реального времени, например
Реализацию COM объекта на C++ как раз удобнее всего делать через множественное наследование, когда твой объект реализует несколько интерфейсов. QueryInterface в этом случае становится тривиальным возвратом this для соответствующего guid. С композицией же ты замучаешься его реализовывать.
Да. Сорри. Почему то я читая "множественное" представлял ромбическое. А у ком Unknown не виртуальный.
Этот паттерн возможно и в виде цепочки наследования реализовать. Оверхед будет на этапе компиляции, но не в рантайме.
Обсуждают сегодня