Le réseau déborde d'explications du "dreaded diamond problem". Tout comme StackOverflow. Je pense que je comprends un peu, mais je n'arrive pas à traduire ces connaissances en comprenant quelque chose de similaire et de différent.Héritage virtuel multiple C++ par rapport à COM
Ma question commence comme une pure question C++, mais la réponse pourrait bien se ramifier dans les spécificités MS-COM. La question du problème général va:
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 */ };
C'est pas la solution classique du diamant. Exactement ce que "virtuel" fait ici?
Mon véritable problème est d'essayer de comprendre un discussion over at our friends' place at CodeProject. Il s'agit d'une classe personnalisée pour créer un conteneur transparent pour le lecteur Flash. J'ai pensé que j'essaierais cet endroit pour s'amuser. Il s'avère que la déclaration suivante plante votre application, avec la version 10 du lecteur Flash.
class FlashContainerWnd: virtual public IOleClientSite,
virtual public IOleInPlaceSiteWindowless,
virtual public IOleInPlaceFrame,
virtual public IStorage
Debugging montre que lors de la saisie des implémentations de fonction (QueryInterface etc.), à partir de différents appelants, je reçois différents « ce » valeurs -pointer pour les appels différents. Mais enlever "virtuel" fait l'affaire! Pas de plantage, et même "this" -pointer.
Je voudrais bien comprendre exactement ce qui se passe. Merci beaucoup.
Vive Adam
Je ne suis pas bon en héritage virtuel. mais est-ce que votre application contient une distribution quelque part qui passe de IOle ou IStorage à FlashContainerWnd? –