网上满是"可怕的钻石问题"的解释.StackOverflow也是如此.我想我明白这一点,但我没有将这些知识转化为理解类似但不同的东西.
我的问题始于一个纯粹的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 */ };
这不是经典的钻石解决方案.究竟"虚拟"在这里做什么?
我真正的问题是试图理解我们朋友在CodeProject上的讨论.它涉及一个自定义类,用于为Flash播放器创建透明容器.
我以为我会尝试这个地方的乐趣.事实证明,以下声明使您的应用程序崩溃,其中包含Flash播放器的第10版.
class FlashContainerWnd: virtual public IOleClientSite, virtual public IOleInPlaceSiteWindowless, virtual public IOleInPlaceFrame, virtual public IStorage
调试显示,当从不同的调用者进入函数实现(QueryInterface等)时,我得到不同调用的不同"this" - 指针值.但删除"虚拟"就可以了!没有崩溃,同样"这个" - 指针.
我想清楚地了解到底发生了什么.非常感谢.
干杯亚当