虚拟课程适合您遇到可怕的钻石.例如:
struct Base { int x; };
struct D1 : Base {};
struct D2 : Base {};
struct Derived : D1, D2 {};
Run Code Online (Sandbox Code Playgroud)
这里,Derived实际上有两个 Base部分,因此调用了两个成员变量x.它将进行编译,但在Derived通过其基类操作对象时可能会遇到一些意外行为.
Derived derived;
D1& d1 = derived;
D2& d2 = derived;
d1.x = 1;
d2.x = 2;
cout << d1.x << d2.x << endl; // 12 !
Run Code Online (Sandbox Code Playgroud)
虚拟继承只通过一次Derived派生来解决这个问题.Base
struct Base { int x; };
struct D1 : virtual Base {};
struct D2 : virtual Base {};
struct Derived : D1, D2 {};
Run Code Online (Sandbox Code Playgroud)
这里Derived只有一个Base部分,一个成员变量被调用x.