虚继承是解决C++多重继承问题的一种手段,从不同途径继承来的同一基类,会在子类中存在多份拷贝。这将存在两个问题:其一,浪费存储空间;第二,存在二义性问题,通常可以将派生类对象的地址赋值给基类对象,实现的具体方式是,将基类指针指向继承类(继承类有基类的拷贝)中的基类对象的地址,但是多重继承可能存在一个基类的多份拷贝,这就出现了二义性。虚继承可以解决多种继承前面提到的两个问题

    1. #include<iostream>
    2. using namespace std;
    3. class A{
    4. public:
    5. int _a;
    6. };
    7. class B :virtual public A
    8. {
    9. public:
    10. int _b;
    11. };
    12. class C :virtual public A
    13. {
    14. public:
    15. int _c;
    16. };
    17. class D :public B, public C
    18. {
    19. public:
    20. int _d;
    21. };
    22. //菱形继承和菱形虚继承的对象模型
    23. int main()
    24. {
    25. D d;
    26. d.B::_a = 1;
    27. d.C::_a = 2;
    28. d._b = 3;
    29. d._c = 4;
    30. d._d = 5;
    31. cout << sizeof(D) << endl;
    32. return 0;
    33. }

    菱形继承中A在B,C,D,中各有一份,虚继承中,A共享。
    上面的虚继承表实际上是一个指针数组。B、C实际上是虚基表指针,指向虚基表。
    虚基表:存放相对偏移量,用来找虚基类