Why is single virtual inheritance not enough to resolve the dreaded diamond problem?

只谈情不闲聊 提交于 2019-12-21 17:45:14

问题


struct B { int i; };
struct D1 : virtual B {};
struct D2 : B {};  // <-- not virtual
struct DD : D1, D2 {};

Having coded above, still the compiler demands D2 also to be virtual:

DD d;
d.i = 0; // error: request for member `i' is ambiguous

What I don't understand is, once you have prompted compiler that B is virtual with respect to DD (via D1) then why it still i is ambiguous ?

(If my memory serves correct, the older VC++ (in 2006), was capable enough to make out this just with single virtual inheritance)


回答1:


B is not virtual with respect to DD - it is virtual with respect to D1. At the time D2 is created, it contains a full copy of B. So now DD has two implementations of B: one as part of D2, and one at the end (pointed by D1). And having two copies of i, using it is indeed ambiguous.

Had D2 also used virtual inheritance, instead of containing a copy of B, it would have contained a pointer to the instance of B that D1 is also pointing at, and DD would have contained only one instance of B.

I'll try to illustrate the memory layouts, hope this comes out right...:

Your case, with one virtual inheritance and one non-virtual -

|    D1    |   D2 + B |    B    |
+--+-------+----------+---------+
 |   vptr to B           ^
 +-----------------------|

Having both D1 and D2 inherit virtually -

|   D1   |   D2   |   B   |
+--+-----+---+----+-------+
 |         |         ^
 +---------+---------|



回答2:


You must read Diamond problem . Under the Approaches heading, for CPP, your case is clearly mentioned, your observation matches the one explained there.




回答3:


The standard requires that d.i must be ambiguous in this case. ISO/IEC 14882:2003 section 10.1.6 covers classes with virtual and non-virtual base classes of a given type.



来源:https://stackoverflow.com/questions/6620497/why-is-single-virtual-inheritance-not-enough-to-resolve-the-dreaded-diamond-prob

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!