【发布时间】:2010-09-22 21:51:31
【问题描述】:
网络上充斥着对"dreaded diamond problem"的解释。 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 */ };
这不是经典的钻石解决方案。 “虚拟”在这里究竟做了什么?
我真正的问题是试图理解 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 等)时,对于不同的调用,我会得到不同的“this”指针值。 但是删除“虚拟”就可以了!没有崩溃,同样的“this”指针。
我想清楚地了解到底发生了什么。非常感谢。
干杯 亚当
【问题讨论】:
-
我不擅长虚拟继承。但是您的应用程序是否包含从 IOle 或 IStorage 内容转换为 FlashContainerWnd 的转换?
标签: c++ com multiple-inheritance virtual-inheritance