Сеть переполнена пояснениями "dreaded diamond problem". Итак, StackOverflow. Я думаю, что я понимаю этот бит, но я не могу перевести это знание в понимание чего-то подобного, но другого.C++ множественное виртуальное наследование по сравнению с COM
Мой вопрос начинается как чистый вопрос на C++, но ответ вполне может переходить в спецификацию MS-COM. общий вопрос проблема выходит:
class Base { /* pure virtual stuff */ };
class Der1 : Base /* Non-virtual! */ { /* pure virtual stuff */ };
class Der2 : Base /* Non-virtual! */ { /* pure virtual stuff */ };
class Join : virtual Der1, virtual Der2 { /* implementation stuff */ };
class Join2 : Join { /* more implementation stuff + overides */ };
Это не классическим решением алмазов. То, что здесь делает «виртуальный»?
Моя настоящая проблема заключается в попытке понять discussion over at our friends' place at CodeProject. Он включает в себя специальный класс для создания прозрачного контейнера для Flash-плеера.
Я думал, что попробую это место для удовольствия. Оказывается, следующее объявление сбрасывает ваше приложение с версией 10 проигрывателя Flash.
class FlashContainerWnd: virtual public IOleClientSite,
virtual public IOleInPlaceSiteWindowless,
virtual public IOleInPlaceFrame,
virtual public IStorage
Отладка показывает, что при входе в реализации функций (QueryInterface и т.д.), от разных абонентов, я получаю разный «это» -указатель значения для различных вызовов. Но удаление "virtual" делает трюк! Никаких сбоев, и того же «этого» -потока.
Я хотел бы четко понимать, что происходит. Большое спасибо.
Приветствия Адам
Я не умею пользоваться виртуальным наследованием. но в вашем приложении содержится листинг, который отсылает из файлов IOle или IStorage в FlashContainerWnd? – 2008-11-18 18:50:57