网络上充斥着关于"可怕的菱形问题"的解释。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 player 的版本 10 有关。
class FlashContainerWnd: virtual public IOleClientSite,
virtual public IOleInPlaceSiteWindowless,
virtual public IOleInPlaceFrame,
virtual public IStorage
调试显示,从不同的调用者进入函数实现(例如QueryInterface等),对于不同的调用,我会获得不同的"this"指针值。 但是去除"virtual"就可以解决问题!没有崩溃,并且相同的"this"指针。
我希望能清楚地理解到底发生了什么。非常感谢。
祝好 Adam