библиотека Я использую много типов, которые все вытекают из одних и тех же 2 интерфейса:Сохранение множественным наследованием объектов в контейнере
class Huey : public IDuck, public ICartoonCharacter
{
...
};
class Dewey : public IDuck, public ICartoonCharacter
{
...
};
class Louie : public IDuck, public ICartoonCharacter
{
...
};
Я хотел бы хранить объекты всех перечисленных выше типов в обертке класса и палки объекта этого класса-оболочки в контейнере. Конечно, я должен был бы вызывать методы, принадлежащие обоим интерфейсам, из моего класса-оболочки.
Какие у меня варианты? Я мог думать о
- хранения
IDuck *
с в моей обертке и dynamic_cast-ИНГICartoonCharacter
или - используя нечто вроде
boost::any
, делая мою обертку класса-шаблон, с паройstatic_asserts
для обеспечения параметров шаблона наследуется отIDuck
иICartoonCharacter
.
но ни один вариант особо апелляций. Есть идеи?
two interfaces, multiple inheritance combine into one container? - родственный вопрос, но ответ Джеймса Канзе не работает для меня, поскольку я не могу изменить 3 класса.
EDIT: Не используйте множественное наследование часто, забыл синтаксис. Теперь наследуем public
от обоих интерфейсов.
EDIT: теперь используется dynamic_cast вместо static_cast (который не будет работать).
EDIT: Я нашел ответы Майка Сеймура и Маттиу М, обещающие. Я соглашусь с одним из их ответов, как только я закодировал все это. Благодаря!
Вы не можете static_cast от 'IDuck *' к несвязанной типа '' ICartoonCharacter *. Вы могли бы dynamic_cast при условии, что 'IDuck' имеет хотя бы одну виртуальную функцию. –
Обычно я использую первый вариант, если возможно использование 'dynamic_cast' (см. Комментарий @SteveJessop выше). –
Я не уверен, но я думаю, что даже если ваши классы детей не могут быть изменены, чтобы наследовать от одного родителя (который, в свою очередь, наследуется от обоих текущих родителей), вы все равно можете использовать такой класс (например, «ICartoonDuck».) Вы можете хранить 'ICartoonDuck' в своем контейнере и меньше беспокоиться о проблемах с макетом памяти. (Тем не менее, вам все равно нужны небезопасные роли, но это все равно взлома.) – yzt