参考:
https://blog.51cto.com/blogger/publish?old=1/h3f0123c6-341133757571bc8357579
http://c.biancheng.net/view/2280.html
虚基类不是自己声明的,而是由派生类声明的,应对于菱形继承的情况。这样一个类既可以作为虚基类也可以作为普通基类。

此时类D有两条线间接继承类A。A<···B<···D,A<···C<···D
如果是正常继承,类D对象会有两份类A的的对象和函数,分贝来自B和C。
但是,通常情况下,类D对象只需要一块类A内存。
此时需要使用虚基类。
这样在派生类D内只有一份A的拷贝,且在D内初始化虚基类A。不用担心在D中的A被初始化三次,编译器会确保。
在类D的继承关系出,我们可以下图这样写。此时D对象中也只有一份A的函数和变量,但是如果有类继承自D,又容易产生菱形继承的二义性问题。