网上充斥着对“可怕的钻石问题”的解释。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”指针值。但是删除“虚拟”就可以了!没有崩溃,并且相同的“this”指针。
我想清楚地了解到底发生了什么。非常感谢。
干杯亚当