Herencia virtual múltiple de C ++ frente a COM

La red está repleta de explicaciones de"temido problema de diamantes". También lo es StackOverflow. Creo que entiendo un poco, pero no puedo traducir ese conocimiento en comprender algo similar pero diferente.

Mi pregunta comienza como una pregunta pura de C ++, pero la respuesta bien podría pasar a los detalles de MS-COM. La pregunta del problema general es:

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 */ };

Esto esno La clásica solución de diamantes. ¿Qué hace exactamente "virtual" aquí?

Mi verdadero problema es tratar de entender undiscusión en casa de nuestros amigos en CodeProject. Se trata de una clase personalizada para crear un contenedor transparente para el reproductor Flash.

Pensé en probar este lugar por diversión. Resulta que la siguiente declaración bloquea su aplicación, con la versión 10 del reproductor Flash.

class FlashContainerWnd:   virtual public IOleClientSite,
                           virtual public IOleInPlaceSiteWindowless,
                           virtual public IOleInPlaceFrame,
                           virtual public IStorage

La depuración muestra que al ingresar a las implementaciones de funciones (QueryInterface, etc.), de diferentes personas que llaman, obtengo diferentes valores de "este" indicador para diferentes llamadas. Peroeliminar "virtual" hace el truco! No se bloquea, y el mismo "este" puntero.

Me gustaría entender claramente exactamente lo que está sucediendo. Muchas gracias.

Saludos Adam

Respuestas a la pregunta(5)

Su respuesta a la pregunta